如何访问自动实现属性的支持变量?

时间:2008-09-14 17:19:54

标签: c# properties

过去我们声明了这样的属性:

public class MyClass
{
    private int _age;

    public int Age
    {
          get{ return _age;  }
          set{ _age = value; }
    }
}

现在我们可以做到:

public class MyClass
{
    public int Age {get; set;} 
}

我的问题是,如何使用此表示法访问自动创建的私有变量?

我宁愿访问私有变量而不是公共访问者'Age'。是否有默认表示法来访问私有变量,或者这是不可能的?

6 个答案:

答案 0 :(得分:92)

新的自动属性的目的是减少在只有get或set中不需要任何特殊逻辑的简单属性时需要编写的样板代码量。

如果您想访问这些属性使用的私有成员,通常会出于以下几个原因:

  • 您需要的不仅仅是简单的get / set - 在这种情况下,您应该避免为此成员使用自动属性。
  • 你想要避免通过get或set获得性能,只需直接使用该成员 - 在这种情况下,如果确实有性能损失,我会感到惊讶。简单的get / set成员非常容易内联,并且在我的(无可否认有限的)测试中,我没有发现使用自动属性和直接访问成员之间的区别。
  • 您只想拥有公共读取权限(即只是“获取”),并且该类直接写入成员 - 在这种情况下,您可以在自动属性中使用私有集。即。

    public class MyClass
    {
        public int Age {get; private set;} 
    }

这通常涵盖了希望直接进入自动属性使用的支持字段的大多数原因。

答案 1 :(得分:23)

您对自动属性的使用意味着您不需要任何属性的获取/设置逻辑,因此私有后备变量是不必要的。

如果您的班级中有任何复杂的逻辑,请不要使用自动属性。只需像往常一样去private int _age和正常的吸气者/背叛者。

IMO,自动属性更适合快速实现一次性对象或临时数据胶囊,如:

public class TempMessage {
    public int FromID { get; set; }
    public int ToID { get; set; }
    public string Message { get; set; }
}

你不需要太多逻辑。

答案 2 :(得分:12)

这种语法通常称为“语法糖”,这意味着编译器采用该语法并将其转换为其他语法。在您的示例中,编译器将生成如下所示的代码:

[CompilerGenerated]
private int <Age>k_BackingField;

public int Age
{
   [CompilerGenerated]
   get
   {
      return this.<Age>k_BackingField;
   }
   [CompilerGenerated]
   set
   {
      this.<Age>k_BackingField = value;
   }

即使了解所有这些,您也可以可能直接访问支持字段,但这样做会破坏使用自动属性的目的。我可能在这里说,因为您依赖于可能在C#编译器的未来版本中随时更改的实现细节。

答案 3 :(得分:10)

  

在幕后发生的事情是注入私有成员变量,前缀为&lt;&gt; k__AutomaticallyGeneratedPropertyField#

来自C# 3.0 Automatic Properties explained

虽然可以直接使用该私人会员,但这非常黑客且不必要。

答案 4 :(得分:7)

你不应该,而且你不太可能。如果您需要访问该属性,只需使用公共属性(例如this.Age)。私有领域支持公共财产没有什么特别之处,使用它优先于财产只是迷信。

答案 5 :(得分:2)

你不能,这是一种语言功能而不是IDE功能。说实话,我更喜欢IDE为你添加私有变量。我同意这个类在内部必须使用公共入口点来访问它自己的变量有点奇怪。因此,我自己并没有使用这个新功能。