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

C# 如何访问自动实现属性的支持变量?,c#,properties,C#,Properties,过去,我们声明的属性如下: public class MyClass { private int _age; public int Age { get{ return _age; } set{ _age = value; } } } [CompilerGenerated] private int <Age>k_BackingField; public int Age { [CompilerGener

过去,我们声明的属性如下:

public class MyClass
{
    private int _age;

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

public int Age
{
   [CompilerGenerated]
   get
   {
      return this.<Age>k_BackingField;
   }
   [CompilerGenerated]
   set
   {
      this.<Age>k_BackingField = value;
   }
现在我们可以做:

public class MyClass
{
    public int Age {get; set;} 
}
我的问题是,如何访问使用此符号自动创建的私有变量


我宁愿访问私有变量,而不是公共访问器“Age”。是否有默认的符号来访问私有变量,或者这是不可能的?

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

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


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

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

public class MyClass
{
    private int _age;

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

public int Age
{
   [CompilerGenerated]
   get
   {
      return this.<Age>k_BackingField;
   }
   [CompilerGenerated]
   set
   {
      this.<Age>k_BackingField = value;
   }
[编译生成]
私人国际大学后勤基地;
公共信息
{
[编译生成]
得到
{
返回此.k_BackingField;
}
[编译生成]
设置
{
此.k_BackingField=值;
}

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

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

如果您的类中有任何复杂的逻辑,请不要使用自动属性。只需像平常一样使用
private int\u age
和普通getter/setter即可

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

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

不需要太多逻辑的地方。

新的自动属性的目的是,当您只需要一个简单的属性,而该属性在get或set中不需要任何特殊逻辑时,减少需要编写的样板代码量

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

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

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

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

您不应该这样做,而且不太可能需要这样做。如果您需要访问属性,只需使用公共属性(例如This.Age)。支持公共属性的私有字段没有什么特别之处,将其优先于属性使用只是迷信。

没错-它们确实减少了bowlerplate代码,我还将广告它们减少了您需要测试的内容。有些人可能会说,您需要测试手动获取/设置,但不需要使用自动属性,因为您可以信任f框架。这里的代码示例错误。它应该是公共类MyClass{public int Age{get;private set;}我同意这个答案。你不能访问私有字段,如果需要的话,那么你不应该首先使用自动属性。谢谢你,我做了编辑,但是当试图修复格式时,我必须再次点击“粘贴”并删除错误的代码块。Doh!常用于POCO对象为什么要添加类的复杂逻辑会影响您是否在该类中使用自动属性?更多的是一致性问题…如果您有复杂的逻辑,那么您将希望根据OO实践从私有支持变量访问它…如果您使用自动属性,那么…在访问这些属性时会出现不一致。既然如此me将有下划线前缀,有些则没有。在这种情况下,访问私有访问器和公共访问器有什么区别?我认为最好是从声明类中的逻辑访问公共访问器。如果您向访问器添加了一些逻辑,您不想更改所有代码。@spoon16我举了一个向访问器添加逻辑并因此不得不更改所有代码的例子。我不太理解这一部分。我一直想知道自动属性的意义是什么。如果你的getter和setter中没有特殊逻辑,为什么还要有它们?@MatthewLock flexibility。使用直接字段访问,你会被锁定在这一点上除非您同时更改所有客户端代码,否则请进行设计。但如果您决定从“伪字段”更改属性,请使用属性如果您决定在setter上添加断言和检查,或者您已经做了什么,那么您可以透明地这样做。如果您正在编写库代码,而您无法控制所有的客户机代码,那么这将更加有用。