79

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

public class MyClass
{
    private int _age;

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

现在我们可以这样做:

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

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

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

4

6 回答 6

92

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

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

  • 您需要的不仅仅是简单的获取/设置 - 在这种情况下,您应该避免使用该成员的自动属性。
  • 您想避免通过 get 或 set 对性能造成的影响,而直接使用该成员 - 在这种情况下,如果真的有性能影响,我会感到惊讶。简单的 get/set 成员非常容易内联,并且在我的(诚然有限的)测试中,我没有发现使用自动属性和直接访问成员之间的区别。
  • 您只想拥有公共读取访问权限(即只是一个“get”)并且类直接写入成员 - 在这种情况下,您可以在您的自动属性中使用私有集。IE

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

这通常涵盖了希望直接访问自动属性使用的支持字段的大部分原因。

于 2008-09-14T17:47:02.157 回答
23

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

如果您的类中有任何复杂的逻辑,请不要使用自动属性。像往常一样去private int _age使用普通的 getter/setter。

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

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

不需要太多逻辑的地方。

于 2008-09-14T17:35:10.533 回答
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# 编译器的未来版本中可能随时更改的实现细节。

于 2008-09-14T17:34:00.580 回答
10

在幕后发生的是注入私有成员变量,前缀为 <>k__AutomaticallyGeneratedPropertyField#

C# 3.0 自动属性解释

尽管可以直接使用该私有成员,但它非常笨拙且不必要。

于 2008-09-14T17:27:26.090 回答
7

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

于 2008-09-14T20:39:14.100 回答
2

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

于 2008-09-14T17:22:56.677 回答