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

4
亲爱的大家,使用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. 请添加一个“回到顶部”按钮。


4
无论哪个都可以使用,没有一个比另一个更好。它们各自适用于不同的目标。 - Binary Worrier
1
重复 - https://dev59.com/pXVC5IYBdhLWcg3wcgmd - ChrisF
@yayan:如果你发现某个答案有用,请使用投票下方的勾选图标将其标记为被接受的答案吗? - Will Vousden
9个回答

14

代码片段12都可以。第二个更方便,适用于不需要访问底层字段时的情况。

但是,应该尽量避免使用代码片段3(除非您有一些特定的需要),因为字段几乎总是应该是私有的。如果您需要为派生类提供设置字段的不同方法(这很少见),则可以使用方法或另一个属性。

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


2
+关于受保护的警告。继承类应该被强制使用基类的属性。 - user1228

11

从第二个片段开始,即:

public string Name { get; set; }

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

我会避免最后一个选项,因为它将允许覆盖类直接访问备份字段,这将使您受限于特定的实现(它还意味着您可爱的验证可以被绕过)


0

标准格式通常为:

private string name;

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

作为标准惯例,字段将是私有的。您的属性将具有 public 保护修饰符。


0
    #region LinkURL

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

    #endregion LinkURL

这种方法很容易生成代码。例如,如果您有带属性的Excel或数据库表格需要实现到一个类中,您可以检查此正则表达式tip:


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
}
}

0

公开属性的作用是避免将类的公共字段暴露给消费者。而属性允许您控制消费者使用它的方式(通过get和set)。

第一个样例很好,但在您的第二个样例中(使用public和protected),您打破了这一点...


0
public string Name {get;set}

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

第三个例子具有受保护的支持字段,因此子类可以直接访问支持字段。

根据您的目标选择格式。此外,考虑询问其他团队成员是否已经有了约定的格式。


0
在我编写的大多数应用程序中,如果getter和setter不比您的示例更复杂,则可能希望尽可能减少代码以提高可读性,因此简写方法非常有用。另一方面,如果在getter和setter中实现了更复杂的逻辑(例如验证或某种解析),则要确保没有用户类绕过您的逻辑。
此外,正如Binary Worner在评论中指出的那样,这取决于您需要什么和想要什么。您知道privateprotectedpublic之间的区别,因此您也知道根据所选择的选项可以做什么和不能做什么。哪一个是“最好的”完全取决于您希望允许其他使用此类的类执行哪些行为(以及不希望允许执行哪些行为)。

0

自动属性(第2条)作为默认选项,除非您的getter/setter具有某种逻辑,否则该属性(或字段)毫无意义 - 您必须同意,直接访问其私有字段的公共属性与公共字段(或自动属性)相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接