在过去,我们声明了这样的属性:
public class MyClass
{
private int _age;
public int Age
{
get{ return _age; }
set{ _age = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以做到:
public class MyClass
{
public int Age {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何使用这种表示法访问自动创建的私有变量?
我宁愿访问私有变量而不是公共访问者'Age'.是否有默认表示法来访问私有变量,或者这是不可能的?
Wil*_*lka 92
新的自动属性的目的是减少需要编写的样板代码量,只需要一个简单的属性,在get或set中不需要任何特殊的逻辑.
如果要访问这些属性使用的私有成员,通常有以下几个原因:
您只希望具有公共读取权限(即只是"获取"),并且该类直接写入成员 - 在这种情况下,您可以在自动属性中使用私有集.即
public class MyClass
{
public int Age {get; private set;}
}Run Code Online (Sandbox Code Playgroud)这通常涵盖了希望直接进入自动属性使用的支持字段的大多数原因.
cha*_*rit 23
您对自动属性的使用意味着您不需要任何属性的获取/设置逻辑,因此私有后备变量是不必要的.
如果您的班级中有任何复杂的逻辑,请不要使用自动属性.private int _age像往常一样去和正常的吸气者/安装者一样.
IMO,自动属性更适合快速实现一次性对象或临时数据胶囊,如:
public class TempMessage {
public int FromID { get; set; }
public int ToID { get; set; }
public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
你不需要太多逻辑的地方.
Sco*_*man 12
这种语法通常称为"语法糖",这意味着编译器采用该语法并将其转换为其他语法.在您的示例中,编译器将生成如下所示的代码:
[CompilerGenerated]
private int <Age>k_BackingField;
public int Age
{
[CompilerGenerated]
get
{
return this.<Age>k_BackingField;
}
[CompilerGenerated]
set
{
this.<Age>k_BackingField = value;
}
Run Code Online (Sandbox Code Playgroud)
即使知道了这一切,你可以很可能直接访问支持字段,但那种失败使用自动属性的目的.我可能在这里说,因为你依赖于一个实现细节,可能会在C#编译器的未来版本中随时改变.
mac*_*die 10
在幕后发生的事情是注入私有成员变量,前缀为<> k__AutomaticallyGeneratedPropertyField#
虽然可以直接使用该私人会员,但这是非常hacky和不必要的.
你不应该,而且你不太可能.如果您需要访问该属性,只需使用公共属性(例如this.Age).私有领域支持公共财产没有什么特别之处,使用它优先于财产只是迷信.
不能,这是一种语言功能,而不是 IDE 功能。老实说,我更喜欢 IDE 为您添加私有变量。我同意类在内部必须使用公共入口点来访问它自己的变量有点奇怪。因此我自己不太使用这个新功能。
| 归档时间: |
|
| 查看次数: |
264695 次 |
| 最近记录: |