过去我们声明属性是这样的:
public class MyClass
{
private int _age;
public int Age
{
get{ return _age; }
set{ _age = value; }
}
}
现在我们可以做:
public class MyClass
{
public int Age {get; set;}
}
我的问题是,如何访问使用此表示法自动创建的私有变量?
我宁愿访问私有变量而不是公共访问器“Age”。是否有访问私有变量的默认表示法,或者根本不可能?
新的自动属性的目的是减少当您只有一个不需要 get 或 set 中任何特殊逻辑的简单属性时需要编写的样板代码量。
如果您想访问这些属性使用的私有成员,通常有以下几个原因:
您只想拥有公共读取访问权限(即只是“获取”)并且类直接写入成员 - 在这种情况下,您可以在自动属性中使用私有集。即
public class MyClass
{
public int Age {get; private set;}
}
这通常涵盖了想要直接访问自动属性使用的支持字段的大部分原因。
使用自动属性意味着您不需要属性的任何获取/设置逻辑,因此不需要私有支持变量。
如果类中有任何复杂的逻辑,请不要使用自动属性。只需像往常一样使用
private int _age
和普通的 getter/setter 即可。
IMO,自动属性更适合快速实现一次性对象或临时数据胶囊,例如:
public class TempMessage {
public int FromID { get; set; }
public int ToID { get; set; }
public string Message { get; set; }
}
不需要太多逻辑的地方。
这种语法通常称为“语法糖”,这意味着编译器采用该语法并将其转换为其他内容。在您的示例中,编译器将生成如下所示的代码:
[CompilerGenerated]
private int <Age>k_BackingField;
public int Age
{
[CompilerGenerated]
get
{
return this.<Age>k_BackingField;
}
[CompilerGenerated]
set
{
this.<Age>k_BackingField = value;
}
即使知道所有这些,您也可以“可能”直接访问支持字段,但这违背了使用自动属性的目的。我在这里说“可能”是因为您所依赖的实现细节可能会在 C# 编译器的未来版本中随时发生变化。