2011-03-31 44 views

回答

7

值類型之間的基本差異,名字告訴,是存儲在內存中的值;參考進行類型是(a種)指針的對象(類,對象,等...)

Microsoft

的數據類型爲值類型,如果它保持在它自己的數據內存分配。引用類型包含指向保存數據的另一個內存位置的指針。

值類型
值類型包括以下內容:

  • 所有數字數據類型
  • 布爾,字符和日期
  • 所有的建築結構,即便其成員是引用類型
  • 枚舉,因爲它們的基本類型始終是SByte,Short,Integer,Long,Byte,UShort,UInteger或ULong

引用類型
引用類型包括以下各項:

  • 字符串
  • 所有數組,即使它們的元素是值類型
  • 類類型,如表格
  • 代表
+0

David Chappell的文章被誤認爲是誤導性的,然後......參見http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx(只有downvoted因爲堆棧/堆部分刪除,我將刪除downvote。) – 2011-03-31 14:32:15

+0

@Jon Skeet:我剛剛刪除了那部分,對不起我的錯誤鏈接 – Marco 2011-03-31 14:34:42

+1

右鍵。我建議你刪除「List item」位:) – 2011-03-31 14:35:28

2

變量引用類型(稱爲對象)存儲對實際數據的引用,有關詳細信息,請參閱here。它們包括類,接口和代表。

MSDN

值類型結構和 枚舉。基於值類型的變量 直接包含 值。將另一個值類型 變量分配給另一個值複製 包含的值。這與參考類型 變量的 賦值不同,該變量將引用複製到對象而不是對象本身。 所有的值類型都是從System.ValueType中隱式派生的 。與具有參考類型的 不同,不能從 從值類型派生新的類型。 但是,像引用類型一樣,結構體 可以實現接口。與 引用類型不同,值類型不能包含空值 。然而, 可空類型功能不會允許 值類型被分配到空

閱讀:http://www.csharptocsharp.com/node/41

+1

.... ......哎喲! – 2011-03-31 14:36:37

+0

@Mr。失望,什麼? – smartcaveman 2011-03-31 14:42:44

+0

我想他是在抱怨你在那裏的一個巨大的聯繫。 – 2011-03-31 14:46:57

17

考慮兩個變量:

SomeReferenceType x; 
SomeValueType y; 

x的值是一個引用 - 它可以是null或對對象本身是SomeReferenceType或派生類的實例。 x的值本身不是對象。

y值是數據本身 - 如果SomeValueType有三個字段,中y值將直接包含這些字段。

這是一個非常簡短的總結 - 有關更多信息,請參見Eric Lippert's blog post about value typesmy article。 (您可能也對我關於parameter passing的文章感興趣,這是相關的,但不完全相同。)

1

當您有一個值類型的變量時,該變量直接保存一個值。如果將其分配給另一個變量,則直接複製該值。當變量是引用類型時,它不直接保存該值,而是引用(指針)到該值。當您複製變量時,您不會複製它指向的值,而是複製參考(指針)。

您可以在MSDN閱讀更多關於:http://msdn.microsoft.com/en-us/library/s1ax56ch.aspxhttp://msdn.microsoft.com/en-us/library/490f96s2.aspx

+1

我更願意談論在兩種情況下工作方式相同的賦值 - 在每種情況下,都會複製變量*的*值,無論該值是直接包含數據還是引用。 – 2011-03-31 14:36:58