toString()只对调试有用吗?

时间:2009-02-19 01:56:11

标签: c# java tostring

除了当然,它们与原语一起使用。我看到的大多数(如果不是全部)实现仅从程序员的角度来看是有用的。


编辑:我知道我应该覆盖默认行为,这就是我提到的实现:)。我确实得到了在GUI中需要字符串表示的一些组件中覆盖它的价值。但是,至少在JDK中,我看到很多的实现,只有在需要调试对象实例时才会使用。

为什么它以Object类为根,因为它只对GUI /调试东西有用?还有其他我不知道的用途吗?

13 个答案:

答案 0 :(得分:17)

不,关键是您应该覆盖ToString()的默认实现以使其有用。 ToString()可以是将某些内容的值输出回UI的好方法。

一个简单的例子就是如果你有一个带有三个字符串的Name类(First,Middle,Last)。您可以使用ToString()方法为UI设置格式:例如,“Last,First Middle”。

或者存储数学运算的类(值Left = 2,Right = 3,Result = 6,运算符enum = Multiply)。致电ToString()以获得“2 * 3 = 6”。

然而,可能更常见的是有各种不同的To<qualifier>String()方法,比如.NET DateTime类。 (ToShortDateString()ToLongDateString()ToLongTimeString(),...)

编辑:至于为什么它根植于Object类,只是因为ToString()任何的有效操作。

此外,字符串可以是数据类型或数据使用者之间编组的好方法,因为它(实际上)保证可以解析并且不需要额外的编码或关注。

答案 1 :(得分:13)

我个人的偏好是toString()应该从不用于调试以外的任何事情。如果要为对象生成字符串,请提供一个单独的方法,清楚地记录您的意图(getName(),getDescription()等)。永远不要依赖于toString()的实现。

问题在于,许多开发人员将toString()视为调试级别的字符串,并且不考虑更改它(例如添加或删除新字段时)。哎呀,一些自动化的toString()构建器使用反射从字段生成一个toString()。

我发现这种偏好多年来一直很好用。

答案 2 :(得分:12)

只要您想要对象的字符串表示,

toString()就很有用。当然,这是出于调试目的,但也可以有效地将操作结果输出给用户。

例如,假设您有一个处理复数的Complex类。如果你想以 3 + 2i 的格式将它们打印给用户,如果它们定义toString()就很方便,因为你不必每次都写入格式,输出就是是一致的。如果您想要更改该表示形式,例如更改为 3 + 2j ,则只需触摸Complex类中的toString()方法。

因此toString()也不用于调试目的,但是获得对象的一致字符串表示的好方法。

答案 3 :(得分:6)

我可以说的是,当我更改了类的toString以显示一些额外的调试信息时,我遇到了代码中断。

有问题的代码是一个GUI库,它决定使用toString的值作为一些内部事物(几年前就是这样......我忘了它究竟是什么)。最终结果是我不再使用该库了。

我想说,因为很多人将toString视为用于调试(无论你认为它应该用于什么的意见),使用从它返回的值是有问题的做任何编程(如解析)或显示给用户。

如果你100%控制toString方法,那么一定要做你想要的。

所以,回答这个问题,没有toString不仅对调试很有用,你可以随心所欲地做任何事情。但是,如果toString以令你不快的方式改变,不要感到惊讶。

答案 4 :(得分:4)

根据我的经验,toString()在调试和日志记录之外几乎没有价值。你不能随着时间的推移依赖它的格式或内容,所以除了人类可读之外,不要依赖于除最简单的对象之外的任何东西(例如原始对象类型)。如果有多个数据成员,则期望它们可能随着时间的推移而改变类型或数量,以及toString()的输出随之改变。

我想强烈提出的另一点。不要在toString()中调用其他方法。没有什么比在调试器中检查断点上的变量内容更糟糕了,然后由于toString()中的方法调用而执行更多的代码。

答案 5 :(得分:3)

我认为重要的是指出那些回答提到“toString”的人注意到小写的“t”通常是在谈论Java,回答提到“ToString”的人通常都是指C#。当然,这不适用于所有回复。

在我自己的观察中(我每天都使用),鼓励C#中的程序员覆盖“ToString”以显示有用的文本表示。然而,在Java中,我几乎没有看到这一点。事实上,我很少看到这一点。

-jP

答案 6 :(得分:2)

首先,toString方法应返回对象的人类可读文本表示。

此问题在Effective Java中显示为第10项:始终覆盖toString

它引用了Java API Specification方法的Object.toString

  

结果应该是简洁但是   信息表示即   方便一个人阅读。

除了调试之外,在将对象放入JListJTable时,覆盖类的toString方法非常有用,默认情况下会使用toString在列表或表格中将对象显示为文本形式的方法。

例如,就我而言,我已经覆盖了添加到toString的对象的JList方法,以便用户能够通过列表查看有关该项目的信息GUI。

因此,确实有toString方法对调试以外的情况有用的情况。关键是让toString方法返回实际上对某人有用的信息,而不是默认的Object.toString实现,其中对象的内存位置用于其文本表示。

答案 7 :(得分:1)

有用
  1. Gui(使用PropertyGrid时的复杂属性,表头文本)
  2. DataBinding(这就是它的工作方式)
  3. 以及任何其他字符串输出。

答案 8 :(得分:0)

当将任何对象打印到字符串时,.NET Framework也会隐式调用ToString()。

Console.WriteLine("My Object is" + object.ToString());

相当于

Console.WriteLine("My Object is" + object);

因为隐式调用了ToString()。

我相信,虽然不确定,调试器使用它来获取对象的“值”。这可能相当方便,但有限。在大多数情况下,编写自己的调试器可视化器会更好。

答案 9 :(得分:0)

在AS3上,我不得不将2D数组转换为1D数组。最快(运行速度)和最简单(编码时间)的解决方案是:

var new1DArray:Array = the2DArray.toString().split(",");

感到惊讶,但它实际上正在按预期工作,也非常快!

答案 10 :(得分:0)

我使用ToString()获取日期时间格式。

http://hunterconcepts.com/content/tools/formats/

答案 11 :(得分:0)

除了其他人已经说过的内容之外,在使用调用它的控件时,重写ToString()也很有用。例如,ComboBox:

myComboBox.Items.Add(new MyClass());
// now, whatever ToString() returns is shown in the
// ComboBox, but you can get the object back by through
// the SlectedItem property.

答案 12 :(得分:-1)

它可能不是“预期”用途,但我已将其用于数据序列化

storeToHardDrive(studentList.ToString());