2010-07-19 37 views
3

在C#中,以下「容器」保存引用類型的引用或對象本身?隊列保持引用或對象值?

Queue 
Stack 
Array 
List 
Vector 

例如,如果我執行以下操作:

Queue<MyItem> item = new Queue<MyItem>(100); 
MyItem mit = new MyItem(); 
item.Enqueue(mit); 

mit的參考被複制到itemmit對象本身已被移動到item存儲器的地址?

如果我說

item = null; 

它不會設置所有對象中item爲null。我對嗎?

回答

5

該隊列包含對包含項目的引用。將隊列設置爲null不會影響項目本身。

+0

其他容器是一樣的嗎? – 5YrsLaterDBA 2010-07-19 17:46:15

+0

@ 5YrsLaterDBA是,只要項目是引用類型 – msarchet 2010-07-19 17:51:43

+0

即使對於基元(值類型)?如果我實例化: '隊列 item =新隊列(100);' 它會自動向對象引用int並使用引用或存儲值嗎?這將是一個真正的低谷,花費更多的內存比它應該:( – DanteTheSmith 2017-04-18 07:29:31

2

這取決於MyItem是否爲值類型(有時在關鍵字後稱爲struct)或引用類型(class)。值類型分配複製值(即整個對象),而引用類型複製引用。

0

將mit的引用複製到item或mit對象本身已被移動到item存儲位置?

所有的
  • 首先,我覺得你關心太多的關於implementaion細節。

  • 「mit的參考」有點意義。 「mit」是一個參考。如果我添加mit2 = mit;,則mit2引用同一個對象。

  • 同樣,將「mit對象本身...移動到項目內存位置」在託管代碼中並不真正有意義。如果我添加item.Enqueue(mit2);,則項目現在有兩個指向同一對象的條目。

+0

爲什麼你認爲'mit'是一個參考?它可以是一個結構是價值型的。在這種情況下,它被複制到隊列中。 – 2017-03-21 22:53:18

+0

@kami問題的最後一行假定存儲在Queue中的東西可以設置爲null,因此它必須是引用類型。 – 2017-03-22 23:52:49

0

麻省理工學院的基準複製到 項目或對象MIT本身已經 移動到項目的存儲位置?

不是。如果所討論的對象是引用類型,那麼它既不被移動也不被複制。更確切地說,對該集合添加了對同一對象的新引用。如果對象是一個值類型,那麼它確實被複制。

如果我說item = null;它不會 將項目內的所有對象設置爲null。 我對不對?

你是對的。它不會對集合中包含的項目做任何事情,無論它們是參考還是值類型。