自动实现的属性中的私有变量在哪里/什么?
没有(显式)引用firstName应该隐藏的firstName私有变量。 你能解释一下这是怎么回事吗? 我假设有一些私有变量被getted和setted。 谢谢。
// auto-implemented property FirstName public string FirstName { get; set; }
基本上,编译器将您的代码转换为以下内容:
private string <__>firstName; public string FirstName { get { return <__>firstName; } set { <__>firstName = value; } }
这不太可能是确切的名称,但在名称中使用尖括号很重要 – 因为它使它成为一个难以形容的名称 。 (这是非官方的术语,但是被广泛使用 – 我不知道Eric Lippert是否实际创造了它,或者他是否只是第一个在我阅读的内容中使用它的人。)这是一个不是有效C#标识符的名称,但CLR非常满意。 这有两个好处:
- 编译器无需担心命名与标识符的冲突
- 编译器不需要担心你是否试图在自己的代码中引用该字段 – 你不能,因为这个名字是无法形容的!
它对所有其他生成的代码使用相同的技术 – 匿名类型,匿名函数,迭代器块等。
是的, 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”
C#编译器在幕后创建后备存储字段,您可以尝试对其进行反编译。 使用Reflector。 你会知道它是如何创造支持领域的。 这是同样的答复
MSDN自动实现的属性
自动实施的财产
其他人已经回答了这个问题,但是进一步的信息……你可以在运行时使用reflection找到支持字段。 查找命名为<< PropertyName >> k__BackingField的字段。
另一篇可能有帮助的post:
- 抽象属性是否会创建私有支持字段?