簡體   English   中英

分配參照對象不為空后,怎么辦?

[英]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關鍵字時,都會保留一個新公寓供您隨意使用。

在您的代碼中, ab只是我們類比所在的公寓的引用

List<int> a = new List<int>(); 您正在租用公寓並創建一個變量a ,其中將包含該公寓的地址。 想象一下,這個參考作為您在紙上寫有公寓地址的注釋。

List<int> b = a; 您只是用與第一篇論文中的公寓地址相同的地址創建了另一個便條。

您實際上是在創建2個不同的注釋,其中包含公寓的地址。

當您運行a = null; 它不會更改b的值,因為ab彼此不相關。 使用我們的類比,您只是在更改第一筆記中寫的內容。 只要您的第二張便箋b您租用的公寓仍將在那里。

以此類推,單元將是進程內存的特殊區域中的數據塊,該區域保留給稱為heap動態分配。 兩個變量ab將是分配在另一個稱為stack的內存的特殊區域中的小數據,該區域包含分配給List<int>的數據塊的地址。

使用此語句, ab “指向”同一對象:

List<int> b = a;

而當你這樣做

a = null;

a指向b “指向”其他內容(仍然指向列表)。

a和b都不是列表,它們僅指向或引用創建的對象

這樣,b有new List<int>(); 地址,因此您將a = null設置得很重要。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM