2009-05-20 42 views
5

.NET性質應該是一等公民然而,在IL code屬性getter和setter作爲get_屬性名set_屬性名實現。爲什麼屬性設置器和getter與get_X和set_X方法衝突?

class Property 
{ 
    int Value { get { return 42; } } 
    int get_Value() { return 6 * 9; } 
    void set_Value(int i) { } // Error even though Value is a read only property 
} 

輸出:

錯誤CS0082:類型 'SO.Property' 已經保留了一個被稱爲 '的get_value' 具有相同的參數類型

錯誤CS0082構件:類型「SO。 Property'已經保留了一個名爲'set_Value'的成員具有相同的參數類型

爲什麼des .NET的igners決定使用可能與用戶代碼衝突的名稱?他們本可以使用非法字符(因爲Java使用$作爲內部類的東西)。

+6

get_Value()和set_Value()格式也違背了C#命名規則(http://msdn.microsoft.com/zh-cn/library/ms229045.aspx):「不要使用下劃線,連字符或任何其他非字母數字字符。「 這可能正是由於這個問題,但問題是你不應該在你的C#代碼中使用這種格式。 – alastairs 2009-05-20 10:56:10

回答

8

對於沒有屬性概念的語言,如J#(這可能會影響設計決策),仍然需要一個簡單的名稱來調用它們。

1

好問題 - 大多數編譯器生成的成員(匿名類型和方法)使用的名稱保證不會與類中的任何成員發生衝突。我認爲這個特定的實例(以及事件方法的生成名稱)是微軟犯了一點錯誤的一個例子。

我能想到的唯一理由就是這個決定是合理的,微軟可能一直希望允許其他語言調用這些本身不具有「屬性」概念或語法的方法。

+1

沒有這麼多的錯誤,這是故意的。這確實使不支持屬性概念的語言可以更容易地調用它們,這也使得通過反射可以輕鬆獲取gettor或settor。 – Abel 2009-10-17 16:54:15

2

因爲它們可能需要從外部代碼中調用。

+0

外部的CLR? – Motti 2009-05-20 10:50:04

7

當實現Properties時,Common Language Specification(CLS)需要在IL中使用get_和set_方法(用特殊位進行裝飾)。這是必要的,以便不同的編譯器(C#,託管的C++,VB.NET,J#,IronPython等)創建可互操作的字節碼。

因此下劃線不是廣義上的「合法」字符。它們不符合CLS,因此不應在非專用接口中使用。

另請參閱MSDN上有關writing CLS-compliant code的文章。

相關問題