2010-08-12 190 views
2

說我有下面的類...如果引用的對象被刪除,引用變量會發生什麼?

Class1 
{ 
    private ArrayList myList; 

    private Class1 
    { 
    // Here fill myList with a bunch of Foo objects. 
    } 

    public ArrayList GetList() 
    { 
    return myList; 
    } 
} 

你有下面的代碼一些其他類的然後說...

Class1 myClass = new Class1(); 
Foo myFavoriteFoo = myClass.GetList()[0] As Foo; 

現在,myFavoriteFoo實際上是對富的引用存在於Class1中的數組列表中。如果Class1內的某些內容從類中刪除特定的Foo或將其丟棄,會發生什麼? myFavoriteFoo立即= null?我猜如果我試圖訪問Foo.SomeMethod()我只會得到一個異常,如「對象引用未設置爲對象的實例」...

回答

2

答案是它不能發生。

dotNet提供類型安全性:引用總是指向一個有效的實例,或者它是空的,沒有其他選項。這就是爲什麼dotNet中沒有手動內存管理(不刪除)的原因。

因此,如果您的代碼持有對某個對象的引用,那麼該引用會阻止垃圾回收。

And Dispose()是別的東西,它有什麼也沒有與一個對象佔用的內存有關。 Dispose()是對(非託管)資源的清理,通常對象將其內部狀態設置爲「無效」。

+0

實際上,如果爲非託管資源正確實施,那麼垃圾收集器會在不再使用該對象時自動釋放分配給託管對象的內存。http://msdn.microsoft.com/zh-cn/library/ system.idisposable.aspx。需要注意的是可以實現'IDisposable',但實際上可能不會使用非託管資源。 – TheCloudlessSky 2010-08-12 12:02:46

+0

@TheCloud:GC自動發佈_all_託管對象,與非託管資源無關。 – 2010-08-12 12:23:04

0

如果對象獲取的設置爲null myFavoriteFoo具有對它的引用myFavoriteFoo仍佔據參考。如果Foo正確實現了IDisposable,那麼如果在對象上調用Dispose()後嘗試訪問它,則會發生異常。

0

引用對象不會被刪除,同時有引用指向它們(有幾個例外,你不必擔心)。當原始引用超出範圍時,其他引用仍將指向您的對象,並且該對象將保持活動狀態。在刪除第二個引用(通過將其設置爲null,爲其分配一個不同的值或使其超出範圍)之後,GC可能會收集它(但不能保證立即執行此操作)。

0

首先您需要閱讀有關參考類型。你可以嘗試自己編寫代碼,看看如果你不懶惰會發生什麼:)

真實的行爲是,如果有人從列表中刪除對象,並不意味着該對象從內存中刪除。垃圾收集器檢查對象是否具有引用,在您的情況下,myFavoriteFoo保存引用,因此GC不會刪除該對象。

在處置的情況下 - 在C#中,無法手動強制刪除對象,即使您調用dispose或析構函數,對象也會被垃圾收集器檢查,並且對象只有在引用0時纔會被刪除它。

這是正確的參考。在.Net中也有WeakReference類,它覆蓋了規則引用的規則。

0

Class1不擁有ArrayList本身。它只是提到它。 myFavoriteFoomyClass.myList都是引用到ArrayList。

所以所有班級所能做的就是將其自己的引用爲null。但是這並不會刪除ArrayList。這意味着只有一個參考。

但只要至少有一個引用,ArrayList不會被刪除。所以你描述的情況永遠不會發生。

0

myFavoriteFoo是另一個(除了一個數組)引用您的對象。只要參考是活的,對象將不會被垃圾收集。因此,從Class1中的數組中移除元素不會影響myFavoriteFoo引用 - 它仍然處於活動狀態。另一方面,如果在Class1中處理對象(通過處理/關閉調用),那麼如果嘗試使用它的方法,則可能會出錯 - 錯誤將會像該對象已經處理過的那樣。

相關問題