我应该使用带有公共getter方法的私有属性/字段,还是直接使用公共属性进行适当的封装?

时间:2018-01-31 13:58:26

标签: c# .net properties encapsulation getter-setter

为了正确封装,我应该使用带有Java手动getter方法的私有属性:

public class Foo {
    private int Prop { get; set; }

    public Foo
    {
        Prop = 1;
    }

    public int GetProp()
    {
        return Prop;
    }
}

或者我应该只使用公共财产?

public class Foo {
    public int Prop { get; private set; }

    public Foo
    {
        Prop = 1;
    }
}

5 个答案:

答案 0 :(得分:2)

属性是在C#中创建getter和setter的方式,因此没有理由像在Java中那样创建getter方法。

换句话说:你应该使用第二个例子。

答案 1 :(得分:0)

通常,正确的方法是:

private int prop;

public int Prop
{
   get { return prop; }
   set { prop = value; } //do other stuff within set if needed.
}

通过这种方式,您可以访问所有内容,但如果需要,仍然可以执行自定义操作(通常是NotifyPropertyChanged)。

答案 2 :(得分:0)

属性只是c#中get_PropertyNameset_PropertyName方法的语法糖。

public class Foo 
{
    public int Prop { get; private set; }
}

相当于:

public class Foo 
{
    private int _prop;

    private void set_prop(int value) { _prop = value; }
    public int get_prop() { return _prop; }
}

最好在可能的情况下使用自动属性,并在需要将逻辑添加到各个字段的getter / setter时使用带有支持字段的属性。
如果属性将是private,就像在第一个示例中那样,您应该只使用一个字段。

答案 3 :(得分:0)

属性的要点通常是你有一个get和set函数,它可以像变量一样使用。你的第一个例子真的很奇怪 - 为什么不让公开的吸气剂? Readonly和Writeonly属性并不罕见:



@WithJwt




关于Backing字段的一个重要规则:非常重要的是不要混淆Property及其支持字段,尤其是在类代码中。如果使用自动实现属性,则该危险不存在。如果您的代码比这更复杂,通常的方法是在支持字段名称后附加下划线(_)。道具/道具很容易混淆。 _Prop和Prop非常难以混淆,特别是自动完成功能。

答案 4 :(得分:0)

通常,方法表示操作,属性表示数据。虽然两个示例都可以相同地使用,但表示状态的“正确”方式是通过属性,并且使用属性正确地告诉消费者您的对象这表示状态,而不是动作。

您还应该考虑序列化和智能感知之类的东西是期望属性而不是方法。