【问题标题】:Should we always specify ToString() explicitly?我们应该总是明确地指定 ToString() 吗?
【发布时间】:2013-07-01 14:58:00
【问题描述】:

我有一个自定义类结构如下。

public interface Stuff { }
public Thing : Stuff 
{ 
  public new String ToString() { return "That's the thing!"; } 
}

然后,在我的代码的其他部分,我有一个将 String 对象作为参数的方法。第一行编译,而第二行不编译。我认为发送对象时默认调用 ToString 。而 Stuff,从 Object 类继承应该已经实现了 ToString(在我的例子中,也被 my 实施)。

Thing thing = new Thing();
MustHaveString(thing.ToString());
MustHaveString(thing);

我错过了什么?

【问题讨论】:

  • 为什么要声明一个 new ToString 方法而不是覆盖现有的方法?哎呀! (但不,ToString 通常不会自动调用。)
  • @JonSkeet 因为根据the internetoverride 可以用在 virtual 方法和 ToString 中i>对象不是。
  • @KonradViltersten ToString 虚拟的。
  • 您的问题不清楚。所有引用类型的对象都派生自对象,因此所有这些对象都有一个ToString 方法。当您创建复杂类型时,ToString 方法的作用通常是输出调用对象的类名(因为它没有被覆盖)。那你哪里有问题? :)
  • ToString 肯定是virtual。见the documentation

标签: c# object-oriented-analysis


【解决方案1】:

您可能会因为诸如String.FormatConsole.WriteLine 之类的调用以及隐式调用ToString 的字符串连接运算符而感到困惑。

不是一般规则。一般来说,如果您需要一个字符串,您需要显式调用ToString 或进行一些其他转换。我不建议创建到 string 的隐式转换 - 它们可能带来的痛苦多于快乐。

建议不要创建新的ToString 方法。相反,您应该覆盖object 声明的那个。隐藏方法几乎总是一个坏主意。在某些情况下您确实想要这样做(例如更改返回类型),但应尽可能避免。

【讨论】:

    【解决方案2】:

    假设 MustHaveString 看起来像:

    public void MustHaveString(string arg)
    

    然后简单地说thing 会导致编译错误,除非thing 隐式转换为string。没有隐式转换,你必须做thing.ToString()。但是,如果您的代码是这样的:

    string myString = "This is a thing: " + thing;
    

    然后ToString被隐式调用,所以它是可选的。

    在大多数情况下,我建议显式调用 ToString 方法,以让阅读您的代码的人清楚地知道发生了什么。

    编辑:既然这个答案被接受了,我想我还应该提到你应该把你的ToString()方法设为override,而不是new。这将导致正常预期的行为,这就是我在上面描述的。

    【讨论】:

      猜你喜欢
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多