Where/what是自动实现属性中的私有变量

本文关键字:变量 属性 实现 what Where | 更新日期: 2023-09-27 18:24:35

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

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

Where/what是自动实现属性中的私有变量

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

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

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

C#编译器在后台创建后台存储字段,您可以尝试使用Reflector对其进行反编译。你会知道,它是如何创建后台字段的。这是相同的回复

MSDN自动实现属性

自动实现的属性

其他人已经回答了这个问题,但还有一些进一步的信息。。。您可以使用反射在运行时找到支持字段。查找命名为<lt;PropertyName>>k_BackingField。

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

  • 抽象属性是否创建了一个私有的后台字段