我应该使用带有 public getter 方法的私有 property/field 还是直接使用 public 属性 进行适当封装?

Should I use a private property/field with a public getter method or directly use a public property for proper encapsulation?

为了正确封装,我是否应该使用私有 属性 和手动 getter 方法,如 Java:

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

    public Foo
    {
        Prop = 1;
    }

    public int GetProp()
    {
        return Prop;
    }
}

或者我应该简单地使用 public 属性?

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

    public Foo
    {
        Prop = 1;
    }
}

通常正确的做法是:

private int prop;

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

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

属性是在 C# 中创建 getters 和 setter 的方式,因此没有理由像在 Java.[=10 中那样创建 getter 方法=]

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

属性只是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,就像在您的第一个示例中一样,您应该只使用一个字段。

属性 的要点通常是你有一个获取和设置函数,可以像变量一样使用。你的第一个例子真的很奇怪——为什么不把 getter 设为 public? Readonly 和 Writeonly 属性并不少见:

//Public property with private get or writeonly
public int Prop { private get; set; }

//Readonyl property
public int Prop { get; private set; }

关于支持字段的一条重要规则:不要混淆 属性 和它的支持字段,这一点非常重要,尤其是在 class 代码中。如果您使用自动实现属性,那么这种危险就不存在了。如果您的代码比这更复杂,一种常见的方法是将下划线 (_) 附加到支持字段名称。 Prop/prop太容易搞混了。 _Prop 和 Prop 真的很难混淆,特别是自动补全功能。

一般来说,方法代表动作,属性代表数据。虽然您的两个示例可以相同地使用,但 'proper' 表示状态的方式是通过属性,并且正确使用属性会告诉对象的使用者这是表示状态,而不是动作。

您还应该考虑序列化和智能感知等事物如何期望属性而不是方法。