你应该引用一个类中的Property或Member Variable吗?

可能重复:
您是否应该通过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"; } } 

这不应该是你真正做出的选择。 设置器中的代码应该运行,在这种情况下使用属性,或者不是,在这种情况下,您使用成员变量。 在大多数情况下,一个是正确的,一个是错的。 在一般情况下,两者都不总是正确/错误,并且它“不重要”是不寻常的。

例如,如果setter代码触发“已更改”事件,您是否希望通知外部对象它是否已更改? 如果你是为了响应之前的更改而改变它,可能不是(无限递归任何人?)如果不是,你可能想要确保它被触发(这样你就不会改变一个值而不会通知任何人的变化)。

如果它只是validation所设置的值是否有效,那么要么您知道,在此上下文中,该值已经过validation且必须有效,在这种情况下,无需再次validation; 设置属性。 如果您尚未validation要设置的内容,则需要运行validation逻辑,因此请使用该属性。

这个问题引起了很多争论,因此这个问题没有明显的答案。

我个人更喜欢通过该属性访问,因为您可能有一些validation或转换代码。 尽管你的吸气剂和制定者都是微不足道的,但未来它们可能会发生变化。

如果你将字段foo包装在属性Foo ,你可能是出于某种原因(转换,事件,validation等)。 因此,一般来说,您应该引用字段foo的唯一位置是属性Foo的getter和setter。 其余代码应引用属性Foo

我确信存在一些不明智的情况,你需要绕过房产的吸气剂和制定者,这当然可以,但这种情况将是规则的例外。

方案1是良好做法。 因为如果使用选项2 ,在设置foo值时会丢失其他内容。

我会使用选项1.如果您要设置变量,则应使用该属性而不是直接访问变量。 这是因为该属性具有您用“//我做其他东西”所指示的额外代码。 你不想仅仅因为你没有设置属性就重复这个“其他东西”……除非你这次设置它时不想做“其他东西”。

老实说,这只是一个理论情况,如果你给出遇到这个问题的实际情况,那么回答会容易得多。

使用INotifyPropertyChanged接口时,如果要更新绑定对象,则必须使用该属性。

如果setter没有逻辑,那么明确声明私有变量没有意义,最好使用自动实现的属性:

  internal string Foo { get; private set; } public void DoSomething() { this.Foo = "some string"; } 

如果setter具有逻辑,则私有变量应仅在setter中使用,并且永远不要在setter之外进行修改。 在任何情况下(在我看来:) :)私有变量永远不会出现在属性setter旁边的任何其他位置。

想象一下代码就像

 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中,该属性不仅用作变量 ,还用作其他事项。 访问同一类中的属性被认为是不好的实践,此外,编译器会建议:

一种仅用于在不传递参数的情况下访问字段的方法,请考虑将其定义为属性。

顺便说一句,您可以更正访问成员变量目录的描述以直接访问成员变量(即,使用字段访问)。