10

我过去曾ToString()适度使用过,我发现它在许多情况下都非常有用。但是,我对这种方法的使用很难证明将这种方法放在System.Object. 我的疯狂猜测是,在为提出 .NET 框架的初始设计而进行的工作和召开会议期间的某个时间点,我们决定有必要(或至少非常有用)包含一种ToString()方法,该方法可以由 .NET 框架中的所有内容实现。

有谁知道确切的原因是什么?我是否错过了很多ToString()证明足够有用的情况System.Object?最初的原因是ToString()什么?

非常感谢!

PS - 再说一遍:我不是在质疑该方法或暗示它没有用,我只是想知道是什么让它如此有用,以至于放在System.Object.

旁注 - 想象一下:

AnyDotNetNativeClass someInitialObject = new AnyDotNetNativeClass([some constructor parameters]);

AnyDotNetNativeClass initialObjectFullCopy = AnyDotNetNativeClass.FromString(someInitialObject.ToString());

这不是很酷吗?

编辑(1):

(A) - 根据一些答案,.NET 语言似乎从 Java 继承了这一点。因此,我将“Java”添加到主题和标签中。如果有人知道在 Java 中实现这一点的原因,那么请说明一下!

(B) - 静态假设FromString与序列化:当然,但那是完全不同的故事,对吧?

4

4 回答 4

14

它最初被添加到 Object 用于调试和记录目的。如果您查看 Object.toString 的 JavaDoc ( http://java.sun.com/javase/6/docs/api/java/lang/Object.html#toString() ),您可以推断出这一点,因为它输出类名,后跟@,后跟对象哈希码的无符号十六进制表示。我可以看到这非常有用的唯一地方是在日志或控制台中。

但是 Java 的创建者故意让这个方法不是最终的,因此子类可以(并且应该)覆盖它,以输出更多特定于子类的信息。他们可能刚刚实现了 JVM,以便将对象传递给任何需要字符串的方法,它会生成上面的哈希值并将其传递给方法,但是他们很好,并将其实现为您可以方便地实现的方法覆盖。

它在对象级别实现,因此您可以放心地假设任何对象都可以写入日志/控制台。它在 Java 语言中是一个方便的假设。

于 2010-02-22T00:04:33.123 回答
6

在不讨论其优点的情况下,我相信这源于 C# 的灵感语言 - Java。创建它的原因(对于两种语言)是为了提供一种方法来获取任何对象实例的字符串表示,包括对不同文化的支持。就那么简单。

于 2010-02-21T23:27:58.237 回答
2

toString()我可以想到定义on的两个技术原因java.lang.Object

  • API (PrintStream.print(Object)例如)取决于Object.toString()

  • 字符串连接运算符+取决于Object.toString()操作数之一是非字符串引用类型的情况。

作为替代方案,可以Printable定义一个提供类似方法的接口(例如) ,toString()并将上述定义为需要一个Printable. (这样可以避免新手尝试打印不过载的对象时出现的困惑toString())。

但是,print(etc) 和+连接只适用于所有事情真的很方便。而且我确信这就是 Java 采用这种方式设计的原因。

编辑- 回应 OP 的这个后续问题:

静态假设的 FromString 与序列化:当然,但那是完全不同的故事,对吧?

假设我正确解析了你的语法......

对象序列化的目标是提供一种可以可靠且有效地反序列化的平面表示。toString() 的目标是提供易于阅读的文本表示。在实践中,“易于阅读”和“可靠且高效地反序列化”是矛盾的。

于 2010-02-22T00:58:15.343 回答
1

我想任何对象都可以有一个字符串表示只是被认为是有用的,如果只是为了调试目的......

于 2010-02-21T23:52:43.163 回答