[英]After assignment referance object is not null, how is possible?
對象a為null,但是我看到對象b在運行時不為null。 為什么對象b在這種情況下不為null?
List<int> a = new List<int>();
List<int> b = a;
a = null;
通過這樣做List<int> a = new List<int>();
您將創建一個位於堆中的對象以及對該對象的一個引用(變量a
)。
通過執行List<int> b = a;
您為堆中的同一對象創建了另一個引用(變量b
)。
這樣就得到了兩個引用和一個對象。
通過這樣做a = null;
您正在殺死一個參考。
那還剩下什么呢? 引用b
引用堆中的對象。
如果要殺死b
,則垃圾收集器將從堆中收集對象,因為它沒有剩余的引用了。
想象一下您租用公寓一段時間后的new
關鍵字。 每當您使用new
關鍵字時,都會保留一個新公寓供您隨意使用。
在您的代碼中, a
和b
只是我們類比所在的公寓的引用 。
在List<int> a = new List<int>();
您正在租用公寓並創建一個變量a
,其中將包含該公寓的地址。 想象一下,這個參考作為您在紙上寫有公寓地址的注釋。
行List<int> b = a;
您只是用與第一篇論文中的公寓地址相同的地址創建了另一個便條。
您實際上是在創建2個不同的注釋,其中包含公寓的地址。
當您運行a = null;
它不會更改b
的值,因為a
和b
彼此不相關。 使用我們的類比,您只是在更改第一筆記中寫的內容。 只要您的第二張便箋b
您租用的公寓仍將在那里。
以此類推,單元將是進程內存的特殊區域中的數據塊,該區域保留給稱為heap
動態分配。 兩個變量a
和b
將是分配在另一個稱為stack
的內存的特殊區域中的小數據,該區域包含分配給List<int>
的數據塊的地址。
使用此語句, a
和b
“指向”同一對象:
List<int> b = a;
而當你這樣做
a = null;
a
指向b
“指向”其他內容(仍然指向列表)。
a和b都不是列表,它們僅指向或引用創建的對象
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.