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

use*_*676 14 c#

没有(显式)引用firstName应该隐藏的firstName私有变量.你能解释一下这是怎么回事吗?我假设有一些私有变量被getted和setted.谢谢.

// auto-implemented property FirstName
public string FirstName { get; set; }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 28

基本上,编译器将您的代码转换为以下内容:

private string <__>firstName;

public string FirstName
{
    get { return <__>firstName; }
    set { <__>firstName = value; }
}
Run Code Online (Sandbox Code Playgroud)

这不太可能是确切的名称,但在名称中使用尖括号很重要 - 因为它使它成为一个难以形容的名称.(这是非官方的术语,但是被广泛使用 - 我不知道Eric Lippert是否真的创造了它,或者他是否只是第一个在我阅读的内容中使用它的人.)这是一个不是有效C#标识符的名称,但CLR非常满意.这有两个好处:

  • 编译器并不需要担心与命名冲突标识符
  • 编译器不需要担心你是否试图在你自己的代码中引用该字段 - 你不能,因为这个名字是无法形容的!

它对所有其他生成的代码使用相同的技术 - 匿名类型,匿名函数,迭代器块等.

  • 我想我从安德斯那里学到了这个问题; 我不知道他从哪里得到它. (7认同)

Ser*_*ruk 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_XXXset_XXX.当C#编译器看到试图获取或设置属性的代码时,编译器实际上会发出对这些方法之一的调用.(c)"通过C#CLR"