用属性或字段重写ToString()方法


  • 何时应该用类属性重写ToString()方法,何时应该用字段重写
  • 只有一种方法有效还是两者都有效
  • 如果两者都可以,在哪些情况下我们应该使用每种方法?

    public override string ToString()
    {
       return String.Format("{0},{1}", this.field1, this.field2);
       // ..or
       return String.Format("{0},{1}", this.Property1, this.Property2);
    }
    

请帮忙???

两者都可以接受。

然而,需要考虑的一点是,属性通常被认为是"面向公共的",而字段通常被大多数C#开发人员认为是"私有的"。

因此,如果您希望能够对未直接修改的内部值调用.ToString(),请使用字段(并将其保留为私有字段)。如果您可以对它们进行外部修改,并且这些外部修改的值通过.ToString()返回,请使用属性。

最后,如果在返回属性值之前需要对其执行任何类型的附加"逻辑"操作,则最好使用属性,因为您可以在属性的getter中对其进行修改。

显然,当您想要返回专门准备的字符串时,您应该重写ToString方法。这不是重复使用。

  • 这两种方法都可以,尽管强烈建议使用属性,因为您将对返回值有更多的控制权

如果getter包含一些逻辑,例如它使用字段的值来计算结果,那么使用property。作为您类的用户,如果在UI(如果我直接使用属性)和堆栈跟踪(如果我使用ToString())中看到不同的值,我会感到惊讶。

已编辑:默认情况下,类不应提供公共或受保护的实例字段。因此,当属性可用时,我建议您避免在ToString()中使用字段,因为您可能会暴露一些敏感数据或不正确的对象状态。

通常,属性表示字段,例如

   // Property1 represent field1
   public String Property1 {
     get {
       if (null == field1)  
         return "[empty]"; // <- more readable 
       return field1;
     }
   } 

这就是为什么属性通常更具可读性,因此IMHO更可取;但是,字段也是一个不错的选择(尤其是在没有封装字段的属性的情况下)。

  // Terse C# 6.0 syntax 
  public override string ToString() {
    return $"{Property1},{Property2}";
  }

最新更新