如何访问自动实现属性的后台变量?

过去我们这样声明属性:

public class MyClass
{
private int _age;


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

现在我们可以做的是:

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

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

我宁愿访问私有变量,而不是公共访问器‘ Age’。是否存在访问私有变量的默认表示法,还是根本不可能?

265314 次浏览

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

在幕后发生的是注入一个私有成员变量,前缀为 < > k _ _ AutomaticallyGeneratedPropertyField #

来自 C # 3.0自动属性解释

虽然可以直接使用该私有成员,但是它非常粗糙,而且没有必要。

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

[CompilerGenerated]
private int <Age>k_BackingField;


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

即使知道所有这些,您仍然可以直接访问后备字段,但是这有点违背了使用自动属性的目的。我在这里说可能是因为您接下来依赖于一个实现细节,这个细节在 C # 编译器的未来版本的任何时候都可能发生变化。

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

如果类中有任何复杂的逻辑,则不要使用自动属性。只需按照 private int _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 usually covers most the reasons for wanting to directly get to the backing field used by the automatic properties.

你不应该这么做,而且你也不太可能需要这么做。如果需要访问该属性,只需使用 public 属性(例如:。年龄)。私有领域支持公有财产没有什么特别的,优先使用公有领域只是迷信。