问题就在代码的注释里面。
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的对象。为什么?
    }
}

解决方案 »

  1.   

           A a = new A(x); //①我的理解是,引用a指向的对象的作用域应该是仅限于f方法体内,离开f的方法体即消亡了。///////
    //////////////////////////////////////
    先理解一下.net垃圾回收机制,然后你就明白了,这里并不是C++的局部对象。。so。不会消亡
            return a;
      

  2.   

    理解错误了
    ①这里,你定义了一个A类型的对象,内存是在堆上分配的。只有值类型的才是在栈上分配的。er。不一定对。.net的内存在哪里分配不一定的。
    2,3就不成问题了吧
      

  3.   

    你用了C和C++中的概念来理解C#了。%>_<%
      

  4.   

    楼主认为应该是哪个对象呢?
    建立在堆上的对象,c++中也不会认作用域来销毁的。所以前面回答是C++局部对象的应该是搞错了。
    在这个例子中f函数的a对象并没有随着函数的结束而结束生命周期,它将应用作为函数值传递出去了。编译器会根据这个函数返回值的生命周期来决定何时销毁该对象。
      

  5.   

    A a=new A(1);
    A b=a;
    a=null;
    Console.Write(b.ToString());结果是 输入1;
    为什么呢?
    A b=a; 这里为b分配了新的存储空间,a 的改变并不会影响b.
      

  6.   

    A a=new A(1); //创建了一个A对象,a是对这个对象的引用,也就是通过a这个地址可以找到这个新建对象
    A b=a;        //把这个地址告诉了b
    a=null;       //a指向null,a不指向什么位置了,但b的指向位置没有变啊。
    Console.Write(b.ToString());