自动实现的属性中的私有变量在哪里/什么?

没有(显式)引用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_XXXset_XXX 。 当C#编译器看到试图获取或设置属性的代码时,编译器实际上会发出对这些方法之一的调用。 (c)“通过C#CLR”

C#编译器在幕后创建后备存储字段,您可以尝试对其进行反编译。 使用Reflector。 你会知道它是如何创造支持领域的。 这是同样的答复

MSDN自动实现的属性

自动实施的财产

其他人已经回答了这个问题,但是进一步的信息……你可以在运行时使用reflection找到支持字段。 查找命名为<< PropertyName >> k__BackingField的字段。

另一篇可能有帮助的post:

  • 抽象属性是否会创建私有支持字段?