可能重复:
Should you access a variable within the same class via a Property?
我最近碰到了这个并且很好奇是否有某种标准,你应该在课堂上参考哪一个。
我的意思是,你是否应该直接访问成员变量或通过属性(除非你需要躲避一些自定义的setter代码)不应该有所区别,但我想确定没有最佳实践为了它。
partial class MyClass {
private string foo;
internal string Foo {
get {
return foo;
}
private set {
foo=value;
// I do other stuff
}
}
public void DoSomething() {
//Option 1;
Foo="some string";
//Option 2;
foo="some string";
}
}
答案 0 :(得分:3)
这不应该是你真正做出的选择。设置器中的代码应该运行,在这种情况下使用属性,或者它不是,在这种情况下,您使用成员变量。在大多数情况下,一个是正确的,一个是错的。在一般情况下,它们都不是对的/错的,并且对于它来说并不常见"无关紧要"。
例如,如果设置者代码触发"已更改"事件,您是否希望通知外部对象它是否已更改?如果您为了响应之前的更改而更改它,可能不会(无限递归任何人?)如果不是,您可能希望确保它被解雇(这样您就不会更改值并没有通知任何人的变化。)
如果它只是验证所设置的值是否有效,那么要么您知道,在此上下文中,该值已经过验证且必须有效,在这种情况下,无需再次验证;设置属性。如果您尚未验证要设置的内容,则希望运行验证逻辑,因此请使用该属性。
答案 1 :(得分:2)
这个问题引起了很多争议,因此这个问题没有明显的答案。
我个人更喜欢通过该属性访问,因为您可能有一些验证或转换代码。尽管你的吸气剂和制定者是微不足道的,但未来可能会发生变化。
答案 2 :(得分:1)
如果您将字段foo
包装在属性Foo
中,则可能是出于某种原因(转换,事件,验证等)。因此,一般来说,您应该引用字段foo
的唯一位置是属性Foo
的getter和setter。其余代码应引用属性Foo
。
我确信存在一些模糊不清的情况,你需要绕过属性的getter和setter,这当然可以,但这种情况将成为规则的例外。
答案 3 :(得分:0)
选项1 是一种很好的做法。因为如果您使用选项2 ,设置foo值时会丢失其他内容。
答案 4 :(得分:0)
我会使用选项1.如果您要设置变量,则应使用该属性而不是直接访问该变量。这是因为该属性具有您指示的额外代码" //我做其他事情"。你不会想要重复这个"其他东西"只是因为你没有设置财产......除非,你不想做其他的东西"当你这次设置时。
老实说,这只是一个理论情况,如果你给出遇到这个问题的实际情况,那么回答会容易得多。
答案 5 :(得分:0)
使用INotifyPropertyChanged接口时,如果您希望更新绑定对象,则必须使用该属性。
答案 6 :(得分:0)
如果setter没有逻辑,那么明确声明私有变量没有意义,最好使用自动实现的属性:
internal string Foo
{
get;
private set;
}
public void DoSomething()
{
this.Foo = "some string";
}
如果setter具有逻辑,则私有变量只应在setter中使用,并且永远不要在setter之外进行修改。 无论如何(在我看来:) :)私有变量永远不会出现在属性setter旁边的任何地方。
答案 7 :(得分:0)
想象一下像
这样的代码public partial class HybridPanel: Panel {
[DefaultValue(BorderStyle.FixedSingle)]
public virtual new BorderStyle BorderStyle {
set {
if(value!=borderStyle) {
borderStyle=value;
base.PerformLayout();
}
}
get {
try {
return borderStyle;
}
finally {
if(borderStyle!=base.BorderStyle)
base.PerformLayout();
}
}
}
BorderStyle borderStyle=BorderStyle.FixedSingle;
bool isCollapsed, isAutoSize;
}
在此conext中,该属性不仅用作变量,还用作其他事项。 访问同一类中的属性 NOT 被认为是一个糟糕的实践,此外,编译器会建议:
仅用于在不传递参数的情况下访问字段的方法,请将define定义为属性。
顺便说一句,您可以更正访问成员变量目录的描述以直接访问成员变量(即使用字段访问)。