垃圾回收

来源:互联网 发布:苏州爱知科技旅游 编辑:程序博客网 时间:2024/04/29 00:46

C#是托管代码,他在运行时,会在内存中划出一块域,让其在里面运行,他不能访问外边的内存,外面的代码也不能访问它的内存。

在C#中值类型和变量都在栈中,而应用类型的是在堆中。

值类型其实是struct类型的,它的变量和值都在栈中,当程序执行完它所声明的域时,他就会被回收。所以变量是有作用域的。

而引用类型的变量是在栈中,而它的的实例是在堆中。   程序有个经常会报的错“为将对象引用设置到对象的实例”就是只在声明了变量,而没有把堆中的对象的引用地址赋给变量。

Person p;或  Person p = null;  或  Person p = lstPerson.Find(p => p.Id == 1);而 lstPerson.Find(p => p.Id == 1)没有找到相对的数据时返回的也是null。这样就会报上面的那个错误。所以用的时候,需要判断下if(p != null) .....;

当我们在堆中实例化一个类后,他会返回一个引用地址给栈中的变量。如果栈中没有变量指向这个地址,那么此对象就会被标记为垃圾数据,等待 GC (垃圾回收器)的回收。GC回收时,会调用类的析构函数。析构函数在类中只能有一个,不能有参数,所以不能有重载,也不能有修饰符。也可以手动调用GC这个类回收,但一般不会去调用。GC只会回收托管代码中的数据。

0 0
原创粉丝点击