2013-10-13 148 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僅實例化兩次,因此終結器當然只能執行兩次。