首页 新闻 搜索 专区 学院

难懂的析构函数!

0
悬赏园豆:20 [已关闭问题]

using System;
public class A
{

  ~public A()
    {
        Console.WriteLine("Destructor instance of A");
      }

  public void F()
    {
      Console.WriteLine("Call A.F()");
      Test.a = this;
    }
}

public class B
{
  private A a = null;

  public void SetA(A a)
    {
      this.a = a;
    }
 
  ~public B()
    {
        Console.WriteLine("Destructor instance of B");
        a.F(); 
       
      }
}


public class Test
{
  public static A a = null;
  public static B b = null;

  static void Main()
    {
      b = new B();
      a = new A();
      b.SetA(a);
     
      b = null;
      a = null;
      GC.Collect();
      GC.WaitForPendingFinalizers();
     
      if(a != null)
        Console.WriteLine("a is not null");
    }
}

当垃圾回收器首先执行A的析构函数的时候,有以下的输出:
Destructor instance of A
Destructor instance of B
Call A.F()
当执B的析构函数时可能使本来没有被引用的A的实例现在被Test.a进行引用,致使B对象符合回收条件而A不具备回收条件。
问题:
1.>A的析构函数不是首先被调用的吗?难道对象被析构后在其他范围内还可以被引用吗?(包括在其他析构函数中或程序入口点中)
2.>A的析构函数执行后还可以正常使用吗?,对A来说执行析构函数后A收到影响了吗?请您详细的解释一下!

问题补充: @eaglet: 在看到您的回复后有一点不明白,请您指正! 首先您在解释中所说的b.SetA(a)中的a和原来的那个a不是一个A对象。这点我和您有不同看法,在文中不管是通过new操作符创建出来的A对象还是B.a中的以及Test.a的A对象它们所指向的都是内存中相同地址.只是引用不同而已。 如果您认为我的看法是错误的,请您具体讲一下。另外如果以上我的观点成立的话,对于析构还请您给于一个更为详细的解释!
shuzhiguolu的主页 shuzhiguolu | 初学一级 | 园豆:32
提问于:2010-02-03 21:22
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册