要使用属性或字段覆盖ToString()方法?

时间:2016-05-10 14:09:42

标签: c# properties field override 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);
    }
    

请帮忙???

4 个答案:

答案 0 :(得分:2)

要么可以接受。

然而,有一点需要考虑的是,属性更普遍被接受为“面向公众”,而字段通常被大多数C#开发人员视为“私有”。

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

最后,如果在返回属性值之前需要对属性值执行任何其他“逻辑”,则属性将更可取,因为您可以在属性的getter中修改它。

答案 1 :(得分:1)

显然,当你想要返回一个你特意准备的字符串时,你应该重写ToString方法。这不是一个要求。

  • 两种方式都可以,但强烈建议使用属性,因为您可以更好地控制返回值。

答案 2 :(得分:0)

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

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

       return field1;
     }
   } 

以及为什么属性通常更易于阅读,因此,恕我直言,更可取;但是,字段也是一个不错的选择(特别是如果没有包含该字段的属性)。

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

答案 3 :(得分:0)

如果getter包含某些逻辑,例如它使用字段值来计算结果,然后使用属性。作为班级的用户,如果我使用ToString(),我会惊讶地看到UI中的不同值(如果我直接使用属性)和堆栈跟踪中。

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

相关问题