使用方法而不是覆盖字符串ToString

时间:2011-03-18 23:42:24

标签: c#

每个对象都有自己的public override string ToString(){ return string; }方法。但我们可以通过自定义方法实现相同的目标。那为什么要有一个单独的覆盖字符串方法?

6 个答案:

答案 0 :(得分:4)

因为它是Object类的公共接口的一部分。库设计者总是可以假设对象有一个ToString()方法,并在需要时使用它。例如,如果您希望类型在组合框内提供格式化文本,则只需覆盖ToString(),并在添加对象时显示它。该控件的作者没有合理的方法来调用自定义方法。这只是一种保证每种类型都能提供自身字符串表示的方法。

答案 1 :(得分:1)

ToString只是一个内置功能,用于将对象转换为其字符串表示形式。因此,每个对象都支持它。如果您想要更好地表示框架为您提供的内容,您可以选择覆盖它。

将ToString保持为short或用内部值修饰有时很有用,因为调试器会显示该值。在这些情况下,添加一个不同的方法来返回字符串以便在其他场景中使用可能是有意义的。

答案 2 :(得分:1)

如果你想在自己的类中使用一些字符串方法,但是你不需要这个方法在其他类上工作,请不要 EVER 为此目的使用ToString()。如果你有人试图找出为什么某些特定的ToString方法被覆盖并且有类似的东西,那将是一场噩梦:

override string ToString()
{
     return "Some very cryptic text"; 
}

要想到为什么应该在这里返回隐藏文本以及使用它的地方并不容易。因此,不要为生产目的覆盖ToString。仅用于调试/测试。

答案 3 :(得分:1)

有很多地方会自动调用对象的ToString()方法。一些比较明显的是调试器监视表达式,复合字符串格式化(String.Format和Console.Write),像ListBox这样的UI控件。虽然您当然可以覆盖它们格式化和调用自定义方法的方式,但覆盖ToString()更容易。

答案 4 :(得分:0)

例如,DataGrid可以假设放入其中的每个对象都具有ToString方法,使其能够显示任何类。它用它来显示它。如果覆盖它,则可以控制返回的内容。对于调试器窗口也是如此,它调用ToString来显示你的任何内容;重新看一下。

答案 5 :(得分:0)

因为它是虚拟的 - 所以即使你知道它只是object,你仍然可以调用.ToString()并期望调用你的自定义覆盖。例如:

object o = new MyClass();

MyClass是您覆盖.ToString()的类。你可以打电话:

o.ToString()

它会调用你的方法。但是,如果您定义了自己的方法,例如.MyToString(),那么o.MyToString()将导致编译器错误,因为它未在object上定义。