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

15

在FirstName类中,没有(显式地)引用firstName私有变量,而FirstName类又应该隐藏这个变量。你能解释一下这是如何工作的吗?我假设有一些私有变量被获取和设置了。谢谢。

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

这是一个重复项。请查看侧面的相关链接。 - leppie
4个回答

30

基本上,编译器会将你的代码转换为类似于以下的内容:

private string <__>firstName;

public string FirstName
{
    get { return <__>firstName; }
    set { <__>firstName = value; }
}

这可能不是确切的名称,但在名称中使用尖括号很重要-因为它使它成为一个 无法发音名称。(这是非官方术语,但被广泛使用-我不知道Eric Lippert是否真正创造了它,或者他只是第一个在我读过的东西中使用了它。)它是一个不是有效的 C# 标识符的名称,但 CLR 却可以很好地处理它。这有两个好处:

  • 编译器不需要担心与您的标识符冲突的命名冲突
  • 编译器不需要担心您是否正在尝试引用自己代码中的字段——您无法这样做,因为名称是无法发音的!

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


7
我想我学会了那个隐语,是从安德斯那里学来的;我不知道他从哪里学来的。 - Eric Lippert

8

是的,编译器会创建一个私有的、匿名的后备字段,只能通过属性的get和set访问器进行访问。(c) msdn

编辑:
当您定义一个属性时,编译器将发出两个方法:get_XXXset_XXX。当C#编译器看到试图获取或设置属性的代码时,实际上会发出对其中一个方法的调用。(c) "CLR via C#"


4

2
其他人已经回答了这个问题,但是有一些更详细的信息……你可以使用反射在运行时找到后备字段。寻找命名为“<< PropertyName>>k__BackingField”的字段。
另一个帖子可能会有所帮助:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接