2011-03-18 46 views
1

每个对象都有自己的public override string ToString(){ return string; }方法。但我们可以通过自定义方法实现同样的效果。那为什么要有一个单独的重写字符串方法使用方法而不是覆盖字符串ToString

+2

为了调试的目的,我发现['DebuggerDisplay'](http://msdn.microsoft.com/en-us/library/ms228992.aspx)属性比'ToString()'更有用,主要因为有很多不同的地方,'ToString()'用于不同的目的。 – Bevan 2011-03-18 23:56:56

回答

1

如果你想在你自己的类中有一些字符串方法,但是你不需要这种方法在其他类上工作,请不要使用EVER为此目的使用ToString()。这将是一个恶梦,当你有人会尝试找出为什么一些特定ToString方法被重写,并有水木清华这样的:

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

这不会是容易猜测为什么神秘的文字应该在这里返回,并且它在哪里用过的。因此,不要为生产目的覆盖ToString。仅用于调试/测试。

4

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

+1

据我所知,它不是任何接口的一部分。它是在对象类本身上定义的。 IFormattable提供了一个ToString方法,但是它需要一个IFormattingProvider参数,因此不是相同的ToString方法。 – 2011-03-18 23:50:12

+0

这里的接口可能意味着一个'class接口',它是由类 – Snowbear 2011-03-18 23:51:46

+2

公开的所有成员集合的类接口我不确定ToString()被指定为最终用户显示目的提供足够的输出,比如格式化文本组合框。我相信它主要用于调试目的。当然,在一些简单的情况下,它恰好对于显示来说已经足够了,但是你的里程可能差别很大,例如本地化不应该由ToString完成。 – Thilo 2011-03-18 23:54:40

0

例如,一个DataGrid可以假定放入它的每个对象都有ToString方法,它可以显示任何类。它使用它来显示它。如果你覆盖它,你可以控制返回的内容。它同样适用于调试器窗口,它调用ToString来显示你正在查看的内容。

1

ToString是一个简单的内置功能,用于将对象转换为字符串表示形式。这是每个物体都支持的东西。如果您想更好地表示框架为您提供什么,您可以选择重写此选项。

将ToString缩短或用内部值进行修饰有时很有用,因为该值由调试器显示。在这些情况下,添加其他方法以返回字符串以便在其他情况下使用可能是有意义的。

0

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

object o = new MyClass(); 

哪里MyClass是你推翻.ToString()类。你可以拨打:

o.ToString() 

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

1

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

相关问题