[英]Is it possible to access properties of a subclass if the object's reference variable is a superclass type?
[英]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;
或不
.........
預先謝謝你們。
參考類型未包裝。 您將把引用從一個變量分配給另一個變量。 唯一發生的復制是引用(通常實現為指針)。 對象中的數據不會被復制,而是保留在原處。
您對值類型或多或少是正確的。
我建議您不要考慮堆和堆棧。 它們是實施細節。 而且,值類型始終存在於堆棧中並不是真的。 相反,您應該從復制語義上考慮它。 值類型始終被復制,引用類型不被復制。 這里的所有都是它的。
編輯:我重讀了您的問題,以試圖了解您的真正要求,因此我可以更清楚地回答。
X
是string
類型的局部變量,其中包含對string
類型的對象的引用。 Y
是object
類型的局部變量,其中包含對string
類型的object
的引用。 允許這樣做是因為string
是從object
派生的,並且變量可以安全地包含對自身類型或該類型派生自其的任何類型(類或接口)的引用。 Z
是object
類型的局部變量,其中包含對string
類型的object
的引用。 在功能上與X
相同。 您僅具有兩個包含對同一對象的引用的變量。 沒有其他引用發生。
我認為您可能會感到困惑,因為您可能會認為參考的創建是在分配期間發生的。 所有分配的工作就是復制引用(對於引用類型)並復制值(對於值類型)。 您只能在方法參數中使用ref
關鍵字創建對引用的引用。
字符串文字增加了一些皺紋。 它們存儲在全局表中,每個唯一字符串文字一個條目。 如果將相同的字符串文字賦值給兩個變量,則它們都將指向(即引用)該全局表中的相同條目。 這與兩次使用new
不同,但是在語義上類似於初始化具有相同值的兩個int
變量。
裝箱時按值復制a
。 b
指的裝箱值a
。 a
和b
是獨立的。
第二個示例也是如此,但是沒有裝箱。 參考已復制。
C#中的賦值始終會復制值或引用。 它從不創建對存儲位置的引用。
是在堆棧中引用堆中字符串文本的數據,還是在堆棧中引用堆中另一個字符串文本的數據?
都不是。 C#中的對象引用始終指向一個對象,而不是另一個引用。 沒有引用鏈之類的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.