Mot*_*tti 6 .net language-design properties
在.NET属性中应该是一等公民,但在IL代码属性中,getter和setter实现为get_PropertyName和set_PropertyName.
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
}
Run Code Online (Sandbox Code Playgroud)
输出:
错误CS0082:类型'SO.Property'已经保留了一个名为'get_Value'的成员,其成员具有相同的参数类型
错误CS0082:类型'SO.Property'已经保留了一个名为'set_Value'的成员,其成员参数类型相同
为什么设计师.NET决定使用可能与用户代码冲突的名称?他们本可以使用非法字符(因为Java $用于内部类).
在公共语言规范(CLS)需要实现属性的时候使用的IL的get_和set_方法(饰有特殊的位).这是必要的,以便不同的编译器(C#,托管C++,VB.NET,J#,IronPython等)创建可互操作的字节码.
因此,底线是不能在更广泛意义上的"法律"的字符.它们不符合CLS,因此不应在非专用接口中使用.
另外,请参阅有关在MSDN上编写符合CLS的代码的文章.