6

.NET属性中应该是一等公民,但是在IL代码中,属性 getter 和 setter 被实现为get_PropertyNameset_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
}

输出:

错误 CS0082:类型“SO.Property”已经保留了一个名为“get_Value”的具有相同参数类型的成员

错误 CS0082:类型“SO.Property”已经保留了一个名为“set_Value”的具有相同参数类型的成员

为什么设计者.NET决定使用可能与用户代码冲突的名称?他们可能使用了非法字符(正如 Java$用于内部类的东西)。

4

4 回答 4

8

对于没有属性概念的语言,例如 J#(这很可能影响了设计决策),仍然需要一个简单的名称来调用它们。

于 2009-05-20T10:49:20.570 回答
8

公共语言规范(CLS) 要求在实现属性时在 IL 中使用 get_ 和 set_ 方法(​​用特殊位装饰)。这是必要的,以便不同的编译器(C#、托管 C++、VB.NET、J#、IronPython 等)创建可互操作的字节码。

因此,下划线不是广义上的“合法”字符。它们不符合 CLS,因此不应在非私有接口中使用。

另外,请参阅MSDN 上有关编写符合 CLS 的代码的这篇文章。

于 2009-05-20T10:52:11.313 回答
2

因为它们可能需要从外部代码调用。

于 2009-05-20T10:48:58.060 回答
1

好问题 - 大多数编译器生成的成员(匿名类型和方法)使用的名称保证不会与类中的任何成员发生冲突。我认为这个特定的实例(以及为事件方法生成的名称)是微软犯了一点错误的一个例子。

我能想到的唯一理由是微软可能一直希望允许其他语言调用这些本身没有“属性”概念或语法的方法。

于 2009-05-20T10:48:42.147 回答