一個結構(值類型)或類(引用類型),我使用別人的SDK,但該文件沒有告訴我什麼是一個結構或類。如何才能知道什麼是C#
我如何知道? typeof
或GetType
只顯示名稱。
我想知道在IDE(VS2010)中;通過編碼方式也是可以接受的。
一個結構(值類型)或類(引用類型),我使用別人的SDK,但該文件沒有告訴我什麼是一個結構或類。如何才能知道什麼是C#
我如何知道? typeof
或GetType
只顯示名稱。
我想知道在IDE(VS2010)中;通過編碼方式也是可以接受的。
以編程方式說,您可以使用GetType().IsValueType
。
從Visual Studio中,您還可以使用對象瀏覽器(如下所示,在查看 - >對象瀏覽器下找到)進行檢查。
如前所述,你可以找到一個泛型類型是否是類型對象上調用IsValueType
類型或價值型。但請注意,測試對象實例是否爲值類型並不重要。儘管C#會假裝引用類型的字段可以容納一個值類型的實例,但這是一種幻覺。對於每個值類型,都有一個具有相同名稱和字段的相應類類型。在存儲位置調用GetType().IsValueType
持有對此類實例的引用將報告爲真,即使存儲位置實際上持有對類對象的引用。這可以通過實現變異接口的結構體(例如List<string>.Enumerator
,我簡稱爲LSE
)輕鬆演示。
LSE
一個被存儲在LSE
類型的變量將表現爲值類型。複製一個LSE
大約是一個列表的第三項返回LSE
類型的另一變量將產生一個第二,獨立枚舉,這也是要返回的第三項。人們可以從任一枚舉器讀取項目而不會影響其他項目。與此相反,如果一個人有IEnumerable<string>
類型的變量,其保持參考一個LSE
,和一個拷貝,爲IEnumerable<string>
類型的另一個變量,一個將具有第二參考相同枚舉器。從一個統計員那裏讀取項目也會推進另一個。換句話說,將LSE
複製到引用類型的存儲位置將產生一些行爲類似於引用類型的東西,因爲在封面下它實際上是一個。
請注意,在存儲位置調用GetType
將不會顯示它是否包含實數值類型,或者它是否包含與值類型關聯的類的對象。在前一種情況下,系統將創建一個與值類型關聯的類的新實例,並調用GetType
,因此在這兩種情況下,GetType
調用實際上都將在類類型實例上處理。
你所描述的是拳擊價值類型的影響。結構總是一個值類型,但如果它是裝箱的,那麼是的,你有一個盒裝副本的引用。您似乎將此描述爲「與值類型關聯的類的對象」和「實際值類型」是兩個不同的東西,但它們不是。 System.Int32的「實例」始終是一個值類型,但是,它可能是盒裝的。 – 2012-02-26 19:30:04
@ LasseV.Karlsen:如果一個通過類型'列表 .Enumerator'的值,以一個例程作爲參數類型'的IEnumerable ',結果將表現爲一個類的類型。 CLS規範(詳細描述了運行典型C#實現的環境)基本上用我描述的術語來描述事物。C#可能會假裝盒裝值類型仍然是值類型,但是由於CLS規範說「在封面下」它們確實不是,並且由於它們的行爲類類型而不是值類型,所以我沒有看到C#定義是有幫助的。 –
supercat
2012-02-26 19:47:15
它會表現爲引用類型,因爲你已經裝箱了,但它仍然是一個值類型。您可以將一個值類型放在一個值中,以便爲參考類型的行爲提供一些*,但不是所有參數類型的行爲,並且值類型永遠不會轉變爲參考類型。 – 2012-02-26 19:51:39