堆和栈的区别?
- 栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义。
- 局部值类型变量、值类型参数等都在栈内存中。
- 堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
不是说字符串是不可变的吗?string s="abc";s="123"; 不就是变了吗?
String
是引用类型,变量中存放的是指针,即指向数据的地址。改变String
类型变量中的内容,实际上是在堆内存中放入了一个新的字符串,并把这个字符串的地址赋值给了变量。- 在这段代码中,s原先指向一个
String
对象,内容是"abc"
,然后我们将s指向"123"
。- 这时的s不指向原来那个
"abc"
的String
对象了,而指向了另一个内容为"123"的String
对象,原来那个对象还存在于内存之中,只是s这个变量不再指向它了。
你对.net 的 GC 的理解。
- GC是.Net 的垃圾收集器,可以进行内存资源的回收。
- 程序员无需关心资源的回收,当一个对象没有任何引用的时候就可以被回收了。
- 一个对象可以被回收并不意味着一定会被立即回收,GC会选择时机进行回收。
- 可以调用
GC.Collect()
让GC立即回收。- GC 不能回收非托管资源,对于非托管资源一般都实现了
IDisposable
接口,然后使用using
关键字进行资源> - 的回收。