问题就在代码的注释里面。
class A
{
private int x; public A(int x) { this.x = x; } public override string ToString() { return x.ToString(); } public static A f(int x)
{
A a = new A(x); //①我的理解是,引用a指向的对象的作用域应该是仅限于f方法体内,离开f的方法体即消亡了。
return a;
} static void Main(string[] args)
{
A aa = f(1); //②这时,f方法内的对象应该已经消亡,引用a应该指向空。
System.Console.WriteLine(aa); //③但这一句语句运行的结果表明了引用aa仍然指向了方法f中new出来的A的对象。为什么?
}
}
class A
{
private int x; public A(int x) { this.x = x; } public override string ToString() { return x.ToString(); } public static A f(int x)
{
A a = new A(x); //①我的理解是,引用a指向的对象的作用域应该是仅限于f方法体内,离开f的方法体即消亡了。
return a;
} static void Main(string[] args)
{
A aa = f(1); //②这时,f方法内的对象应该已经消亡,引用a应该指向空。
System.Console.WriteLine(aa); //③但这一句语句运行的结果表明了引用aa仍然指向了方法f中new出来的A的对象。为什么?
}
}
//////////////////////////////////////
先理解一下.net垃圾回收机制,然后你就明白了,这里并不是C++的局部对象。。so。不会消亡
return a;
①这里,你定义了一个A类型的对象,内存是在堆上分配的。只有值类型的才是在栈上分配的。er。不一定对。.net的内存在哪里分配不一定的。
2,3就不成问题了吧
建立在堆上的对象,c++中也不会认作用域来销毁的。所以前面回答是C++局部对象的应该是搞错了。
在这个例子中f函数的a对象并没有随着函数的结束而结束生命周期,它将应用作为函数值传递出去了。编译器会根据这个函数返回值的生命周期来决定何时销毁该对象。
A b=a;
a=null;
Console.Write(b.ToString());结果是 输入1;
为什么呢?
A b=a; 这里为b分配了新的存储空间,a 的改变并不会影响b.
A b=a; //把这个地址告诉了b
a=null; //a指向null,a不指向什么位置了,但b的指向位置没有变啊。
Console.Write(b.ToString());