字段和属性C#中的最佳实践

时间:2010-02-15 11:57:24

标签: c# c#-3.0

亲爱的,哪一个是使用C#的最佳实践?为什么? 1。

private string name;

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

2

public string Name { get; set; }

3

protected string name;
public string Name
{
  get { return name; }
  set { name = value; }
}

4。 请添加......

9 个答案:

答案 0 :(得分:14)

小片 1 2 都很好。第二种方法是在不需要访问底层字段时编写第一种方法。

但是,

Snippet 3 通常应该避免(除非您有特殊原因需要它),因为字段应该几乎总是私有的。如果你需要提供一种不同的方法来为后代类设置(不太可能),那么你可以使用方法或其他属性。

请记住,受保护的成员本质上只是一个稍微受限制的公共成员,因为只要它位于后代类中,它就可以被客户端代码访问。这意味着客户端代码可以直接绑定到类的实现而不是它的接口,这是坏事

答案 1 :(得分:11)

从第二个片段开始,即

public string Name { get; set; }

当您需要添加验证时,将其更改为第一个代码段的形式,或者在设置值时执行某些逻辑。

我会避免使用最后一个选项,因为它允许覆盖类直接访问将您绑定到特定实现的支持字段(这也意味着可以绕过您可爱的验证)

答案 2 :(得分:0)

标准格式通常为:

private string name;

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

字段将作为标准做法私有。您的属性将具有public保护修饰符。

答案 3 :(得分:0)

公开财产,是为了避免将类的公共领域暴露给消费者。而属性允许您控制消费者使用它的方式(通过get& set)。

第一个没问题,在你的第二个样本中(使用公共和受保护的)你就是打破了......

答案 4 :(得分:0)

public string Name {get;set}

第二个示例是自动属性,通常在getter和setter中没有任何逻辑时使用。它也是写第一个例子的简短形式。

第三个示例有一个protected支持字段,因此可以通过子类直接访问支持字段。

根据您的目标选择格式。另外,请考虑询问其他团队成员是否已达成一致的格式。

答案 5 :(得分:0)

在我编写的应用程序中,如果getter和setter并不比你的例子复杂,你可能希望尽可能地减少代码的可读性,因此简写方法非常有用。另一方面,如果在getter和setter中实现更复杂的逻辑(例如验证或解析某种类型),则需要确保没有用户类绕过您的逻辑。

另外,正如Binary Worner在评论中指出的那样,这取决于你需要什么,以及你想要什么。您知道privateprotectedpublic之间的区别,因此您也知道您可以和不能对您的班级做什么,具体取决于您选择的班级。哪一个是“最好的”完全取决于您希望(并且不希望)允许其他类使用此行为的行为。

答案 6 :(得分:0)

将自动属性(N°2)写为默认值,除非你的getter / setter中有某种逻辑,否则属性(或字段)就没有了 - 你必须同意一个直接的公共属性访问其私有字段与公共字段(或auto-propeprty)相同。

答案 7 :(得分:0)

    #region LinkURL

    private string _LinkURL = String.Empty;
    public string LinkURL
    {
        get { return _LinkURL; }
        set { _LinkURL = value; }
    }

    #endregion LinkURL

这种方式很容易生成代码。例如,如果你有Excel属性或db表,你必须实现一个类,你可以检查这个正则表达式tip:

答案 8 :(得分:0)

通过字段或get操作读取两个属性的最佳做法是什么?我自己的结论是从现场获得,因为这是你想要处理的信息,只需要问我是否认为错了。

   private string _key;
   private string _subKey;
   private string _fullKey;

   public string SubKey
    {
        get
        {
            return _key;
        }
        set
        {
            _key = value;
        }
    }

    public string SubKey
    {
        get
        {
            return _subKey;
        }
        set
        {
            _subKey = value;
        }
    }

1。

public string FullKey
{
get
{
return _subKey + _key;
}
}  

2

public string FullKey{
get
{
return SubKey + Key
}
}