2013-10-13 102 views
0

我已经通过了下面的代码,但是当我调试我发现像析构函数被调用两次的代码。因为它应该被称为4次r1,r2,r3,r4。我错过了一些东西。请帮助我,我是新来的c#。 这里在什么时候结构对象被破坏。析构函数没有正确调用

using System; 
struct Struct1 
{ 
    public int Value; 

} 
class Class1 
{ 
    public int Value = 0; 
    ~Class1() 
    { 
     Console.WriteLine("Calling destructor"); 
    } 
} 
class Test 
{ 
    static void Main() 
    { 
     Struct1 v1 = new Struct1(); 
     Struct1 v2 = v1; 
     v2.Value = 123; 
     Class1 r1 = new Class1(); 
     Class1 r2 = r1; 
     r2.Value = 123; 
     Console.WriteLine("Values: {0}, {1}", v1.Value, v2.Value); 
     Console.WriteLine("Refs: {0}, {1}", r1.Value, r2.Value); 
     vivek(); 
     viku(); 
     Console.ReadKey(); 
    } 
    static void viku() 
    { 
     Struct1 v1 = new Struct1(); 
     Struct1 v2 = v1; 
     v2.Value = 123; 
     Console.WriteLine("Values: {0}, {1}", v1.Value, v2.Value); 
    } 

    static void vivek() 
    { 
     Class1 r3 = new Class1(); 
     Class1 r4 = r3; 
     r4.Value = 15; 
     // Console.WriteLine("Values: {0}, {1}", v1.Value, v2.Value); 
     Console.WriteLine("Refs: {0}, {1}", r3.Value, r4.Value); 
     Console.Write("Calling vivek"); 
    } 

} 
+6

这是C#中的终结器,它与C++析构函数不一样。您应该阅读Finalization和垃圾收集器。此外,它不应该被解雇4次..你假设参考副本是一个深层克隆..它不是。 –

回答

3
Class1 r1 = new Class1(); 
    Class1 r2 = r1; 

Class1 r3 = new Class1(); 
    Class1 r4 = r3; 

创建每两个单独的对象具有两个引用。即使你有四个引用,仍然只有两个对象要完成。所以〜Class()只被调用两次 - 每个对象一次。

有些类似于C++代码是:

shared_ptr<Class1> r1(new Class1()); 
    shared_ptr<Class1> r2 = r1; 

shared_ptr<Class1> r3(new Class1()); 
    shared_ptr<Class1> r4 = r3; 

这将只调用Class1的析构函数的两倍。

3

Class1仅实例化两次,因此终结器当然只能执行两次。