我们应该始终明确指定ToString()吗?

Kon*_*ten 1 c# object-oriented-analysis

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

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

然后,在我的代码的其他部分,我有一个方法,将String对象作为参数.第一行编译,而第二行不编译.我认为在发送对象时默认调用ToString.并且,继承自Object类的Stuff应该已经实现了ToString(在我的情况下,也被我的实现所掩盖).

Thing thing = new Thing();
MustHaveString(thing.ToString());
MustHaveString(thing);
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Jon*_*eet 10

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

但这不是一般规则.通常,如果需要字符串,则需要ToString显式调用或进行其他转换.我不建议创建隐式转换string- 它们可能会带来更多痛苦而不是快乐.

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


Tim*_* S. 5

假设MustHaveString看起来像:

public void MustHaveString(string arg)
Run Code Online (Sandbox Code Playgroud)

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

string myString = "This is a thing: " + thing;
Run Code Online (Sandbox Code Playgroud)

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

在大多数情况下,我建议明确调用该ToString方法,以便让读取代码的人清楚地知道发生了什么.

编辑:因为这个答案被接受了,我想我还应该提到你应该让你的ToString()方法成为一个override,而不是一个new.这将导致正常预期的行为,这就是我上面所描述的.

  • 我受到了抨击.:( (2认同)