当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何访问自动实现属性的支持变量?》经验,为你挑选了5个好方法。

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

public class MyClass
{
    private int _age;

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

现在我们可以做到:

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

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

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



1> Wilka..:

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

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

您需要的不仅仅是一个简单的get/set - 在这种情况下,您应该避免使用此成员的自动属性.

你想避免通过get或set获得性能,只是直接使用成员 - 在这种情况下,如果确实有性能损失,我会感到惊讶.简单的get/set成员非常容易内联,并且在我的(无可否认有限的)测试中,我没有发现使用自动属性和直接访问成员之间的区别.

您只希望具有公共读取权限(即只是"获取"),并且该类直接写入成员 - 在这种情况下,您可以在自动属性中使用私有集.即

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

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


代码示例在这里是错误的.它应该是公共类MyClass {public int Age {get; 私人集;}}我同意这个答案.您无法访问私有字段,如果需要,则不应首先使用"自动属性".

2> chakrit..:

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

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

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

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

你不需要太多逻辑的地方.



3> Scott Dorman..:

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

[CompilerGenerated]
private int k_BackingField;

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

即使知道了这一切,你可以很可能直接访问支持字段,但那种失败使用自动属性的目的.我可能在这里说,因为你依赖于一个实现细节,可能会在C#编译器的未来版本中随时改变.



4> macbirdie..:

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

从C#3.0自动属性解释

虽然可以直接使用该私人会员,但这是非常hacky和不必要的.



5> Wedge..:

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


@MatthewLock灵活性.使用直接字段访问时,除非您同时更改所有客户端代码,否则您将被锁定在该设计中.但是如果您决定将其从"伪字段"更改为计算属性,或者如果您决定在setter上添加断言和检查,或者您拥有什么,则使用属性,您可以透明地执行此操作.如果您正在编写库代码,则无法控制所有客户端代码,这将更加有用.
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有