2010-03-10 46 views
8

我知道有一些差別,C#中值類型和引用類型之間有什麼區別?

  1. 值類型的存儲位置作爲參考類型存儲在託管堆上在棧上。
  2. 值類型變量直接包含其值,其中作爲參考變量僅保持到被託管堆上創建的對象的位置的參考。

是否有任何其他區別,我錯過......如果是這樣,它們是什麼?

+8

問了很多次了,所以...... – 2010-03-10 06:20:53

+0

@Wheat,快速搜索,不,這個問題沒有被問到或直接回答。 – strager 2010-03-10 06:22:50

+3

我沒有時間在此刻完全回答這個問題 - 但我只是想指出,「值類型存儲在堆棧上」是言過其實。請參閱http://pobox.com/~skeet/csharp/memory.html。有關引用類型與值類型的更多信息,請參閱http://pobox.com/~skeet/csharp/references.html – 2010-03-10 06:25:25

回答

21

請閱讀:The stack is an implementation detail,不要以後再重複堆棧分配就是與引用類型的.NET區別值類型的鴨式佈局。 CLR可以選擇在任何想要的地方分配一個變量。

最重要的區別是在分配語義。將值類型分配給變量(或將其作爲參數傳遞給方法)時,所有數據都將被複制。分配引用類型時,只複製引用 - 兩個引用都指向內存中的同一個對象實例。

+0

有點粗俗,但嘿,這是我學到的最好的方式,就像你對甘道夫生氣並等待他用他的聲音向你解釋給你帶來的煩惱一樣,它傾向於堅持= d – Coops 2012-11-19 15:54:15

2

正如Aaronaught和Eric的博客文章中提到:

記住的規則,引用類型總是去堆,而值類型總是去他們宣稱在哪裏呢?如果值類型在方法之外聲明,但在引用類型內部,它將被放置在堆中的引用類型中。

0

我覺得值隱含分配內存,但不引用它們必須被分配內存類型明確

14

這裏有一些額外的差異:

  1. 值類型不能被繼承,而引用類型可以
  2. 值類型實現爲一個結構,引用類型爲一類
  3. 值類型,默認情況下,不能分配實空值(?語法是一種變通方法,仍然不會導致真正的空值)
  4. 將值類型賦值給另一個變量,或者將其作爲參數傳遞給方法中的一個參數,然後使用引用類型變量表示對象的內存位置
  5. 它是一個編譯 - 結構聲明一個明確的無參數構造函數的時間錯誤,但同樣不適用於一個類
  6. 在結構中分配所有字段之前使用「this」對象時出現編譯時錯誤,但是同樣不適用於類
  7. 結構未在其構造函數中完全分配所有屬性時出現編譯時錯誤,但同樣不適用於類
相關問題