2012-10-16 31 views
7

我在理解.NET中的值類型表示時遇到了問題。 每個值類型都派生自System.ValueType類,那麼這是否意味着值類型是一個類?.NET中的值類型實際上是如何工作的?

例如,如果我寫:

int x = 5; 

它指:i創建一個」寫入變量x System.Int32類的實例?

+1

[System.ValueType](http://msdn.microsoft.com/ en-us/library/system.valuetype.aspx) – Oded

+2

_derived from System.ValueType class_這是一種特殊的派生形式,與繼承不同。它內置於Fx中。 –

+2

對於將來的讀者:[**關於價值類型的真相**](http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx ) –

回答

6

System.ValueType類實際上只是一個「元」類,內部處理方式與普通類不同。結構和原始類型隱式地繼承了System.ValueType,但是這種類型在運行時並不實際存在,它只是程序集標記一個類應該被視爲一個值類型結構並採用按值傳遞語義的方式。

與其他答案相反,值類型並不總是分配在堆棧上。當它們是一個類中的字段時,當它們被實例化時,它們就像其他類數據一樣坐在堆上。當在迭代器或閉包中使用時,局部變量也可以被提升爲隱式類。

+0

謝謝你,非常有幫助 –

-1

值類型不是類。這些是語言中的內建類型,由.NET CTS(通用類型系統)處理。 CTS是CLR中的一個組件,負責處理諸如bool,int,double,float等值類型。 當您創建值類型的對象時,它將在堆棧上創建。當你將它傳遞給一個函數或從一個函數返回時,會在RAM中爲它創建一個新對象。但是在引用類型的情況下,只傳遞對象的引用,並且不在inm內存中創建新對象。 有些用戶定義的值類型不在語言規範中,並且由用戶定義。這些值類型從System.ValueType繼承。 此類值類型的示例是複數。我們可以使用System.ValueType來創建自己的用戶定義的複數類型。

+0

我不會downvote,因爲這是你的第一天,但​​請閱讀其他回答的評論 –

+1

我要倒下,因爲它是錯誤的。請參閱http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx,瞭解值類型的詳細處理。 –

+0

@ThomSmith:雖然堆棧是一個實現細節,但基本點是正確的:值類型存儲位置(包括編譯器臨時對象)不包含類對象。 C#規範可能聲稱「Int32」字段的內容繼承自「System.Object」,但是CLI規範(它描述了託管代碼的世界如何實際工作)清楚地表明'System.Int32'描述了兩種類型:一個從'System.Object'派生的堆對象類型和一個不是對象的存儲位置類型。 C#規範可能會假裝否則,但這並不正確。 – supercat

0

現在,有很多要談論的。嚴重的是,網絡上有關於這個主題的數百頁,其中大部分以驚人的速度燒傷了我的腦部疾病。

我實際記得的是,int和Int32是一樣的東西,它們都像一個結構,而不是一個類。 「int」是Int32的快捷方式。 (如果你把你的鼠標一個int,則提示寫着「結構System.Int32」 這意味着:。

public class BoxedInt 
{ 
    public int x; 

    public BoxedInt(int i) { x = i; } 
} 

public Test() 
{ 
    BoxedInt bi = new BoxedInt(10); 
    Boxed(bi); 
    Console.WriteLine(bi.x); // Returns 11, as any reference type would. 

    int vi = 10; 
    Valued(vi); 
    Console.WriteLine(vi); // Returns 10, because it acts like a struct. (Which it is) 
} 

public void Boxed(BoxedInt i) 
{ 
    i.x++; 
} 

public void Valued(int i) 
{ 
    i++; 
} 
+0

'public void Valued(ref int i)'會返回11,因爲...? – AgentFire

+0

盒裝退貨11,有價值退貨10. – LightStriker

+0

盒裝價值,或者如果您願意,包含在一個類內的價值就像在一個盒子裏面。如果我告訴你方塊存在的位置並更改其內容,我可以選中該方塊並查看您所做的更改。爲此,該類作爲一個盒子,只要代碼中的某處引用該盒子,它就會存在。至於正常價值,我可以告訴你價值,但我不能給你。如果你決定改變它,除非你明確地告訴我,否則我無法知道。爲此,「我」只存在於Valued方法的流水線中,並在方法完成後立即銷燬。 – LightStriker

1

Eric Lippert's article

總之,值類型是按值複製的值。類型就像引用類型一樣,值類型實例也是對象。5是一個對象,實例爲System.Int32(簡稱int)。

相關問題