您应该在类中引用Property还是Member Variable?

时间:2013-01-23 17:49:22

标签: c# .net-4.0 properties

  

可能重复:
  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";
    }
}

8 个答案:

答案 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定义为属性。

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