在.NET
属性中应该是一等公民,但在IL
代码属性中,getter和setter实现为get_
PropertyName 和{{1 }} 的PropertyName
set_
输出:
错误CS0082:类型'SO.Property'已经保留了一个名为'get_Value'的成员,其参数类型相同
错误CS0082:类型'SO.Property'已经保留了一个名为'set_Value'的成员,其参数类型相同
为什么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
}
的设计师决定使用可能与用户代码冲突的名称?他们可能使用了非法字符(因为Java使用.NET
作为内部类的东西)。
答案 0 :(得分:8)
对于没有属性概念的语言,例如J#(可能很好地影响了设计决策),仍然需要一个简单的名称来调用它们。
答案 1 :(得分:7)
Common Language Specification(CLS)在实现Properties时需要在IL中使用get_和set_方法(用特殊位修饰)。这是必要的,以便不同的编译器(C#,托管C ++,VB.NET,J#,IronPython等)创建可互操作的字节码。
从广义上讲,强调 不是“合法”字符。它们不符合CLS,因此不应在非私有接口中使用。
另外,请参阅有关MSDN上的writing CLS-compliant code的这篇文章。
答案 2 :(得分:2)
因为可能需要从外部代码调用它们。
答案 3 :(得分:1)
好问题 - 大多数编译器生成的成员(匿名类型和方法)使用的名称保证不会与类中的任何成员冲突。我认为这个特定的实例(以及事件方法生成的名称)是微软犯了一点错误的情况。
我能想到的唯一理由是,微软可能一直希望允许其他语言调用这些本身没有“属性”概念或语法的方法。