2015-08-14 52 views
-2

雖然我理解C#中弱和強引用的概念,並且可以找到關於此問題的很多材料,但是有一個簡單的問題令我困惑。對象實例化和弱引用

讓我們來看看這個簡單的場景:

class MyClass {} 

class MyClass2 
{ 
    public MyClass2() 
    { 
     // #1 
     new MyClass(); 
    } 
} 

class Program 
{ 
    static void MyMethod(MyClass instance) { }   

    static void Main() 
    { 
     MyClass2 instance = new MyClass2();    

     // #2 
     MyMethod(new MyClass()); 

     // #3 
     WeakReference<MyClass> instance2 = new WeakReference<MyClass>(new MyClass()); 
    } 
} 

,我們可以說,我們已經用我們的實例化對象弱引用在#1,#2,#3?或者只是在#3?這裏有什麼不同?

+2

什麼是downvote? –

+2

我不認爲這個問題值得反對。理解混亂,但不應該被低估。 – CarbineCoder

+1

@ un-lucky這個問題並不是真的關於類型,這裏的主要問題是*'我們是否在#1#2#3行上使用弱引用'*? – Fabjan

回答

3

只有在#3行,我們可以有點證明「使用弱引用實例化對象」:在第3行中,指向新創建實例的唯一引用是弱引用(這意味着該實例在實例化後可能會變成垃圾回收)。

行#1不是一個弱引用,它不是一個參考。當然,如果您在此之後立即調用某個內容(例如new MyClass().ToString()),則會自動簡要創建一個將在ToString()運行時處於活動狀態的引用,但該引用將是強大的,因爲實例需要保持活動狀態,而ToString()爲正在執行。

第2行不是弱引用, MyMethodinstance參數是一個正常的強引用,它將保持在#2行上創建的實例處於活動狀態,只要該參數在範圍內即可。


:一般情況下,它並沒有多大意義,說「X使用弱引用實例化」。對象使用構造函數實例化。 之後的事實,只有一個弱引用碰巧指新實例與實例化過程無關。