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

时间:2012-02-13 06:52:56

标签: c#

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

// auto-implemented property FirstName
public string FirstName { get; set; }

4 个答案:

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

答案 2 :(得分:4)

C#编译器在幕后创建后备存储字段,您可以尝试对其进行反编译。使用Reflector。你会知道它是如何创建支持领域的。 here's the same reply

MSDN Auto-Implemented property

Auto implemented property

答案 3 :(得分:2)

其他人已经回答了这个问题,但是进一步的信息......你可以在运行时使用反射找到支持字段。查找名称为&lt;&lt;的字段的PropertyName&GT;&GT; k__BackingField

另一篇可能有帮助的帖子: