为什么需要重写ToString方法?

3
我是一位C#编程的初学者,最近开始攻读本科学位。我的意思是,我是新手。
我标记了我遇到问题的地方。问题在于我不明白为什么需要在代码中加入override。
有两个对象类型为object(第一个和剩余的)。
public Pair()
  {
    first = rest = null;
  }

public Pair(Object o)
  {
    first = o;
    rest = null;
  }

public Object First()
  {
    return(first);
  }
public Object Rest()
  {
    return(rest);
  }

public Pair Connect(Object o)
  {
    rest = o;
    return(this);
  }

//这里是我不理解的“重写字符串ToString”代码。为什么需要重写它?

 public override string ToString()
  {
    string output = "(";
Pair p = this;
while (p != null) {
      if (p.First() == null)
        output += "NULL";
      else
        output += p.First().ToString();
      if (p.Rest() is Pair)
    p = (Pair)(p.Rest());
      else {
    if (p.Rest() != null)
          output += " . " + rest.ToString();
    break;
  }
  output += " ";
}
    output += ")";
    return(output);
}

1
你不必覆盖它,但在许多情况下它非常有用。例如在“异常”或“调试”时。如果你执行Console.WriteLine(new Pair());,它实际上会调用ToString方法。 - kevintjuh93
每个对象都有一个ToString方法,假设你有一个名为Person的类,它具有像FirstName、LastName等属性。有时候最好重写ToString方法,以返回例如FirstName + " " + Surname,而不是默认的"NameSpace.Person"。 - Jeremy Thompson
永远不要编写你不理解的代码。保证你会自己发现为什么重写 ToString() 方法是有用的。 - Hans Passant
相关帖子 - 何时适合覆盖 ToString? - RBT
2个回答

2

如果您有一个对象,并且想要更改它表示为字符串的方式,那么您可以重写 ToString 方法。

通常,这是出于格式化选项的考虑,以便在将项目打印到控制台时,您可以控制将其显示给谁。

例如,给定以下类:

    class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }

Person 类的实例打印到控制台会显示:命名空间+类名,从可读性的角度来看并不理想。

将类更改为以下形式:

    class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }

        public override string ToString()
        {
            return String.Format("Name: {0} Age: {1}.", this.Name, this.Age);
        }
    }

产出:姓名:... 年龄:... 省略号表示提供的值。这比之前的方案更易读。


你应该提到需要重写它的原因是因为它已经在Object类中实现了,而所有其他对象都是从该类派生的。 - kkyr
@kyriacos_k:这个答案已经被Amadan解决了。 - npinti
现在 c# 6 已经发布,您可以使用 $"..." 来格式化字符串! - Sweeper

0
如果你的问题是“为什么重写ToString有用”,npinti有答案。
如果你的问题是“为什么我在ToString上使用override而不是其他方法”,那么答案是:因为ToString在祖先类中被定义,而你正在定义的其他方法没有。如果你重写一个继承的方法而没有标记它使用override关键字,编译器会抱怨,只是为了检查一下这是否真的是你想做的事情,或者你是否忘记了这个方法存在于祖先中。

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