簡體   English   中英

對象類型變量是引用嗎? 還是也可以作為參考?

[英]Is an object-type variable a reference, and that's it? or can it also be a reference to a reference?

嗨,我在學習C#中的裝箱和拆箱概念時遇到了一個快速問題(封閉式問題):

“對象”類型的變量(它是引用類型變量)可以采用值類型變量或引用類型變量的副本。

讓我們考慮一個在堆棧中聲明的對象類型變量。

首先,它獲取值類型變量的副本:

int a;
object b = a;

其次,它獲取引用類型變量的副本:

string c;
object d = c;

現在的問題是:與第一個對象類型變量(對象b)相比,第二個對象類型變量(對象d)在內存中由堆棧中的引用表示,堆中的數據類型為int類型。 )是否在堆棧中有對堆中字符串文本數據的引用,或者在堆棧中有對堆中字符串文本數據的另一個引用的引用?

換句話說:

string X = "ABC";

等於:

object Y = "ABC";

或:

object Z = X;

或不

.........

預先謝謝你們。

參考類型未包裝。 您將把引用從一個變量分配給另一個變量。 唯一發生的復制是引用(通常實現為指針)。 對象中的數據不會被復制,而是保留在原處。

您對值類型或多或少是正確的。

我建議您不要考慮堆和堆棧。 它們是實施細節。 而且,值類型始終存在於堆棧中並不是真的。 相反,您應該從復制語義上考慮它。 值類型始終被復制,引用類型不被復制。 這里的所有都是它的。

編輯:我重讀了您的問題,以試圖了解您的真正要求,因此我可以更清楚地回答。

Xstring類型的局部變量,其中包含對string類型的對象的引用。 Yobject類型的局部變量,其中包含對string類型的object的引用。 允許這樣做是因為string是從object派生的,並且變量可以安全地包含對自身類型或該類型派生自其的任何類型(類或接口)的引用。 Zobject類型的局部變量,其中包含對string類型的object的引用。 在功能上與X相同。 您僅具有兩個包含對同一對象的引用的變量。 沒有其他引用發生。

我認為您可能會感到困惑,因為您可能會認為參考的創建是在分配期間發生的。 所有分配的工作就是復制引用(對於引用類型)並復制值(對於值類型)。 您只能在方法參數中使用ref關鍵字創建對引用的引用。

字符串文字增加了一些皺紋。 它們存儲在全局表中,每個唯一字符串文字一個條目。 如果將相同的字符串文字賦值給兩個變量,則它們都將指向(即引用)該全局表中的相同條目。 這與兩次使用new不同,但是在語義上類似於初始化具有相同值的兩個int變量。

裝箱時按值復制a b指的裝箱值a ab是獨立的。

第二個示例也是如此,但是沒有裝箱。 參考已復制。

C#中的賦值始終會復制值或引用。 它從不創建對存儲位置的引用。

是在堆棧中引用堆中字符串文本的數據,還是在堆棧中引用堆中另一個字符串文本的數據?

都不是。 C#中的對象引用始終指向一個對象,而不是另一個引用。 沒有引用鏈之類的東西。

暫無
暫無

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

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