我如何访问自动实现的属性的支持variables?
过去我们宣称这样的属性:
public class MyClass { private int _age; public int Age { get{ return _age; } set{ _age = value; } } }
现在我们可以做到:
public class MyClass { public int Age {get; set;} }
我的问题是,我怎样才能访问使用这个符号自动创build的私有variables?
我宁愿访问私有variables而不是公共访问者“年龄”。 是否有一个默认的符号来访问私有variables,或者它是不可能的?
新的自动属性的目的是减less你需要编写的样板代码的数量,当你只有一个简单的属性,在get或set中不需要任何特殊的逻辑。
如果你想访问这些属性使用的私有成员,通常有几个原因:
- 你需要的不仅仅是一个简单的get / set – 在这种情况下,你应该避免使用这个成员的自动属性。
- 你想要避免通过获取或设置的性能打击,只是直接使用成员 – 在这种情况下,如果真的出现性能问题,我会感到惊讶。 简单的获取/设置成员是非常容易内联,并在我(确定有限)的testing中,我没有find使用自动属性和直接访问成员之间的区别。
-
你只想拥有公开阅读权限(即只是一个'get'),并且类直接写给成员 – 在这种情况下,你可以在你的自动属性中使用一个私有集合。 即
public class MyClass { public int Age {get; private set;} }
这通常涵盖了大多数想要直接到达自动属性所使用的后台字段的原因。
您对自动属性的使用意味着您不需要获取/设置属性的任何获取/设置逻辑,因此不需要私有备份variables。
如果您的课堂中有任何复杂的逻辑,请不要使用自动属性。 只要private int _age
一样去private int _age
和普通的getter / setter。
海事组织,自动属性更适合于快速实施一次性物品或临时数据胶囊,如:
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#编译器的任何一点发生变化。
在幕后,会发生什么是注入私有成员variables,前缀为<> k__AutomaticallyGeneratedPropertyField#
从C#3.0自动属性解释
尽pipe可能直接使用该私人成员,但这是非常冒险和不必要的。
你不应该这样做,而且这是不太可能的。 如果您需要访问该属性,只需使用公共属性(例如this.Age)。 支持公共财产的私人领域没有什么特别的地方,优先使用财产只是迷信。
你不能,这是一个语言function,而不是IDEfunction。 说实话,我宁愿IDE然后添加私人variables为你。 我同意,在内部不得不使用公共入口点来访问它自己的variables是有点奇怪的。 因此,我不会使用这个新function。