OO设计 - 您是否在内部使用公共属性或私有字段?

Sei*_*bar 6 c# oop coding-style

我在C#2.0工作,但这适用于大多数面向对象的语言.当我创建具有包装私有字段的公共属性的类时,我会在内部是否应该使用属性或字段之间来回切换.当然C#3.0使自动属性更容易,但它仍然适用.

有关系吗?

public class Person
{
    private string _name = "";

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public Person(string name)
    {
        _name = name; //should I use the property or field here?
    }
}
Run Code Online (Sandbox Code Playgroud)

Dev*_*inB 14

基本上,因为您可以在属性中实现验证和其他逻辑,所以除非您有特殊原因,否则应通过该属性进行访问.

它有助于在对象中保持一致性,因为这样您就知道私有字段的值已经经过了您选择放入访问器或setter方法的任何严格要求.

另一方面,构造函数可能是一个例外,因为您可能想要设置初始值.

但总的来说,我会说通过该物业进入.

编辑

一个(琐碎的/做作的)例子

public class Person
{
    private string _name = "";
    private List<String> oldnames = new ArrayList();

    public string Name
    {
        get { return _name; }
        set 
        {
           oldnames.Add(_name);
           _name = value; 
        }
    }

    public Person(string name)
    {
        _name = name; //should I use the property or field here?
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,您希望构造函数跳过该属性,但如果您再次使用该字段,则会导致代码中出现错误,因为您正在跳过"名称归档".在您的属性中进行验证的原因是您不需要在访问该字段的每个位置复制验证代码,因此即使在私有方法中也不应跳过它.


poc*_*sov 2

大多数情况下,它就像代码首选项,但我更喜欢使用公共属性或私有属性,您可以简单地向属性添加一些逻辑,而无需对调用者代码进行任何更改。另外,在 3.5 .NET 中,您还有有用的代码糖作为自动属性。