1、大排档和学校食堂。一个是别人帮你收拾盘子,一个是自己收拾盘子。
2、垃圾收集GC(Garbage Collection)。内存的分配、回收不需要程序员操心,程序员只要需要的时候new就可以,用完了不用管,有人帮你清除不用的内存。这个人就是“垃圾收集器”。.Net程序员一般不用像C++程序员那样处理内存的申请和回收,是因为有GC。
3、GC优点:程序员不用关心内存的申请和回收,缺点:不用的内存不能立即得到回收(GC并不会实时去回收不用的内存,而是找时机才回收)。.net有没有内存泄露(Memory Leak)?内存泄露:这块内存确实没人用了,但是却没人回收,这就导致可用内存越来越少。
4、当对象一定不再有用的时候GC就可以将对象回收了(悲观!)。判断一个对象是否一定不再有用的标准就是没有任何的变量指向它。当一个变量设置为null的时候。
Person p1=new Person(“lilei”);//在内存中创建了Person对象
Person p2 = p1;//把p2指向p1指向的对象!这一刻p1指向着leilei,p2就顺着p1找到了lilei
p1=null;//p1不再指向lilei 。lilei不能回收,因为p2还在指着它
p2= new Person(“hanmeimei”);//lilei可以回收,因为没有任何变量指着它。
当没有任何变量指向lilei的时候,就没法再顺着任何的变量把p3指向lilei了。
5、当一个对象一旦被最后一个指向它的变量抛弃的时候(=null或者变量出了作用域),不可能再有任何变量指向它,它就像断了线的风筝,再也飞不回来了,因此就可以被回收了。
6、当一个对象找不回来的时候就可以被GC了。
7、例:
DataSet ds1 = new dataset();
ds2=ds1;
ds1=null;
ds2=null;
//new dataset()的对象已经悬空,没有任何变量能再指向它,他就不能再用了void Main()
{
Person p1 = new Person();
p2 = p1;//让p2指向p1指向的对象。
Console.WriteLine("hello");
p1.SayHello();
p1=null;//不可以被回收,因为还有p2指向它
p2=null;//可以被回收,没有任何对象指向它
p3=...
}void Hello()
{Person p1 = new Person();p1.SayHello();
}
//出了Hello就可以被回收了private Person myp;
void Hello1()
{Person p1 = new Person();p1.Sayhello();myp=p1;
}
//出了hello1还不会被回收。因为myp指向它