2010-08-05 70 views
8

我最近讀到C#和CLI標準定義了處理值類型和構造函數的不同方法。C#&CLI與值類型和構造函數有什麼區別?

根據CLI規範,值類型不能具有無參數構造函數,而在C#規範中,值類型具有默認無參數構造函數。如果根據CLI規範,您需要創建一個值而不指定任何參數,那麼需要一個特殊的指令來執行此操作。

所以我的問題是

  • 爲什麼C#的設計者有意從CLI標準偏差 - 什麼好處在那裏這一點,爲什麼不CLI允許這種功能?
  • 在我有限的經驗中,任何時候當我發現自己使用'特殊指令'來允許最初並不打算使用的功能時,它通常都是一些黑客行爲。這有什麼不同?
+0

您是否使用Reflector查看過代碼? – 2010-08-05 09:41:32

+0

不,我沒有任何特定的代碼來看待,因爲我將這個問題的基礎是我讀的東西 – DaveDev 2010-08-05 09:48:47

+0

出於興趣,你在哪裏讀過它?我知道這是我已經指出的幾次,但我沒有看到很多其他人提到它。 – 2010-08-05 09:49:36

回答

7

在各種地方,是有意義從一致性的角度來考慮的值類型爲具有參數構造。您始終可以在不提供任何參數的情況下創建值,在CLI和C#中都是如此。在C#中,你可以使用標準的構造函數語法:

int x = new int(); 

,而不是存在是爲這一個語法和不同的語法用於調用一個「真正」的構造。

注意,作爲C#2,有默認值操作,我想可以已經代替:

int x = default(int); 

,感覺更接近IL產生的,真的。我想這只是可能的,如果我們開始的話,C#不會「假裝」所有的值類型都有無參數的構造函數。

在另一方面,考慮泛型:

public void Foo<T>() where T : new() 
{ 
    T t = new T(); 
} 

應該說是允許值的類型?這 - 但如果C#不容許new int()那就沒有多大意義,允許它在一個通用的形式...

你可能想看看更深入一個有趣的一點 - 儘管C#不會讓你定義一個自定義值類型的無參數構造函數,你可以在IL中這樣做,並且C#將會有時根據上下文使用它(有時不會)。見my blog entry for more details

0

而在C#規格值類型都有一個默認參數的構造函數

那你不能改變。所以效果是一樣的,只是有不同的定義。

0

值類型和類類型之間的一個重要區別是,類型實例與值類型實例不同,只能通過調用構造函數來實現,並且不會暴露給外部世界,直到構造函數完成或顯式公開正在構建的對象。相比之下,通過創建具有值類型字段的封閉結構或類類型實例或創建值類型元素數組,可以創建值類型實例。儘管微軟無法爲結構定義明確的無參數構造函數是沒有任何技術原因的,但要確保每個結構在暴露給外部世界之前運行無參數構造函數是很困難的,如果在某些情況下運行這樣的構造函數,而不是其他運算,則會產生混淆。

相關問題