2011-05-16 69 views
6
var a = MyClassInstance; 
    MyClassInstance = null; 
    //if (a !=null){ //why } 

我認爲aMyClassInstanceMyClassInstance等於空,則a必須等於空了。但a不爲空,我不明白爲什麼。引用類型

+0

我不認爲這是「補上」班級的正確方法。你可能不得不打電話給一個內部銷燬功能。您正在將類中的某些內容設置爲NULL,但actaull類仍然存在並且不爲空... – ppumkin 2011-05-16 08:24:10

回答

4

可變a是一個參考,因此它保持的值是一些對象的「位置」。 MyClassInstance也是一個參考。通過設置a = MyClassInstance,它們都指向相同的實例。將MyClassInstance設置爲null只會影響該引用。它不會影響對象本身,也不會影響任何其他引用。

5

aMyClassInstance是對對象的引用。
更改一個參考不會改變另一個參考。

var a = MyClassInstance; // Both references point to the same object 
MyClassInstance = null; // MyClassInstance now points to null, a is not affected 
+0

a和MyClassInstance是對象的引用嗎?不是內存區域? – Alexandre 2011-05-16 08:26:14

+1

在一天結束時,這是一樣的。 – 2011-05-16 08:27:27

+0

@Alex事實上引用被實現爲指針是一個實現細節http://blogs.msdn.com/b/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx – AakashM 2011-05-16 08:32:12

2

因爲你要分配給null剛剛引用位於堆您的實際實例變量MyClassInstance。您不要以任何方式觸摸您的實際類實例。

事實上,你不能直接釋放你的類實例佔用的內存;這是垃圾收集器的用途。它看起來是否有任何引用(思考指針,但不是)剩下的實例,如果沒有剩餘,則從內存中刪除/收集該對象。

也許這使得它更清晰:http://en.csharp-online.net/Value_vs_Reference

2

引用類型實例的變量主要是指向一個內存地址 - 所以你的例子是媲美

int MyClassInstance = 0x1234; // points to a memory containing *your* values 
int i = MyClassInstance; 
MyClassInstance = 0x0; 
if (i !=0x0){ //still 0x1234, because it's a copy } 

或者換句話說: 變量是引用,而不是對象本身。所以第二個變量是引用的副本。

+0

但它的價值類型,而不是引用! – Alexandre 2011-05-16 08:56:45

+0

是的,正如名稱所示:一種參考類型。所以當你從一個引用類型創建一個變量時得到的是一個**引用**。而對於自身的引用是一種特殊的值類型來解決內存。取決於您的CPU,它可能是32位或64位的值。 – Kelon 2011-05-16 09:03:48