class Destruct { public int x; public Destruct(int i) { x = i; } ~Destruct() { Console.WriteLine(x); } public void Generator(int i) { Destruct o = new Destruct(i); } } class Program { static readonly Int32 number = 10; static void Main(string[] args) { int count = 0; Console.WriteLine("Hello World"); Destruct ob = new Destruct(0); for (count = 1; count < 200000; count++) { ob.Generator(count); } Console.WriteLine("Done"); }
环境为VS2010。
这个程序运行时,输出总是
Done
199999
0
199998
.
.
1
为什么总是最后一个Generator函数创建的对象被先释放,然后是ob被释放,然后才按顺序释放Generator创建的对象,怎么解释。
finalize的调用是由GC控制滴。
对象的回收没有一个严格固定的顺序,只有大概的规则(比如0代>1代等)。对于同一代中的对象,顺序不能够确定(而且也没有什么官方文档明确过这个顺序)。你把你代码中的count修改一下,或者换个环境运行你的代码,结果都有可能不同。
不是,这个顺序是确定的,不管数字换成多少,比如20,一定是19,0,18....1。
@冰呆瓜: 那是你的机器。其他人就未必。