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

时间:2013-07-01 14:58:01

标签: c# object-oriented-analysis

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

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

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

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

我想念什么?

2 个答案:

答案 0 :(得分:10)

由于String.FormatConsole.WriteLine之类的调用以及字符串连接运算符(可能会ToString无效),您可能会感到困惑。

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

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

答案 1 :(得分:5)

假设MustHaveString看起来像:

public void MustHaveString(string arg)

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

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

然后隐式调用ToString,因此它是可选的。

在大多数情况下,我建议明确调用ToString方法,以便让阅读代码的人明白发生了什么。

编辑:由于此答案已被接受,我想我还应该提一下,您应该将ToString()方法设为override,而不是new。这将导致正常预期的行为,这就是我上面所描述的。