【问题标题】:Where/what is the private variable in auto-implemented property?自动实现的属性中的私有变量在哪里/什么?
【发布时间】:2012-02-13 06:52:55
【问题描述】:

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

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

【问题讨论】:

标签: c#


【解决方案1】:

基本上,编译器会将你的代码转换成这样的:

private string <__>firstName;

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

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

  • 编译器无需担心与您的标识符的命名冲突
  • 编译器无需担心您是否尝试在自己的代码中引用该字段 - 您不能,因为名称无法说出!

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

【讨论】:

  • 我想我是从安德斯那里学到的。我不知道他是从哪里弄来的。
【解决方案2】:

是的, 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”

【讨论】:

    【解决方案3】:

    C# 编译器在后台创建后备存储字段,您可以尝试反编译它。使用反射器。您将了解它是如何创建支持字段的。 here's the same reply

    MSDN Auto-Implemented property

    Auto implemented property

    【讨论】:

      【解决方案4】:

      其他人已经回答了这个问题,但还有一点信息......你可以在运行时使用反射找到支持字段。查找具有类似 >k__BackingField 命名的字段。

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

      【讨论】:

        猜你喜欢
        • 2011-11-26
        • 2012-07-03
        • 1970-01-01
        • 2012-06-30
        • 2011-12-28
        • 2015-10-03
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        相关资源
        最近更新 更多