没有(显式)引用firstName应该隐藏的firstName私有变量。你能解释一下这是怎么回事吗? 我假设有一些私有变量被getted和setted。 感谢。
// auto-implemented property FirstName
public string FirstName { get; set; }
答案 0 :(得分:26)
编译器基本上会将您的代码转换为以下内容:
private string <__>firstName;
public string FirstName
{
get { return <__>firstName; }
set { <__>firstName = value; }
}
这不太可能是确切的名称,但在名称中使用尖括号很重要 - 因为它使它成为不可言状的名称。 (这是非官方的术语,但是被广泛使用 - 我不知道Eric Lippert是否真的创造了它,或者他是否只是第一个在我阅读的内容中使用它的人。)这是一个不是有效C#标识符的名称,但CLR非常满意。这有两个好处:
它对所有其他生成的代码使用相同的技术 - 匿名类型,匿名函数,迭代器块等。
答案 1 :(得分:8)
是,
the compiler creates a private, anonymous backing field that can only be accessed through the property's get and set accessors.
(c)msdn
编辑:
定义属性时,编译器将发出2个方法:get_XXX
和set_XXX
。当C#编译器看到试图获取或设置属性的代码时,编译器实际上会发出对这些方法之一的调用。 (c)“通过C#CLR”
答案 2 :(得分:4)
C#编译器在幕后创建后备存储字段,您可以尝试对其进行反编译。使用Reflector。你会知道它是如何创建支持领域的。 here's the same reply
答案 3 :(得分:2)
其他人已经回答了这个问题,但是进一步的信息......你可以在运行时使用反射找到支持字段。查找名称为&lt;&lt;的字段的PropertyName&GT;&GT; k__BackingField
另一篇可能有帮助的帖子: