Java和.NET中ToString()的原始原因是什么?

我过去曾经适度地使用过ToString() ,并且在很多情况下我发现它非常有用。 但是,我使用这种方法几乎不能将此方法放在System.Object 。 我的猜测是,在执行工作期间的某个时刻以及为了提出.NET框架的初始设计而召开会议时,我们认为包含ToString()是必要的 – 或者至少非常有用 -将由.NET框架中的所有内容实现的方法。

有谁知道具体原因是什么? 我是否遗漏了大量的ToString()certificate有用的情况,以便成为System.Object一部分? ToString()的原始原因是什么?

非常感谢!

PS – 再说一遍:我不是在质疑这个方法,也不是暗示它没有用,我只是想知道是什么让它变得非常有用,因为它被放置在System.Object

旁注 – 想象一下:

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

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

这不是很酷吗?

EDIT(1):

(A) – 基于一些答案,似乎.NET语言从Javainheritance了这一点。 所以,我正在为主题和标签添加“Java”。 如果有人知道为什么这是用Java实现的,那么请说清楚!

(B) – 静态假设FromString vs Serialization:当然,但这是一个完全不同的故事,对吧?

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

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

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

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

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

  • PrintStream.print(Object) API(例如)依赖于Object.toString() ;

  • 字符串连接运算符+在其中一个操作数是非String引用类型的情况下依赖于Object.toString()

作为替代方案, 可以定义一个接口(比方说) Printable ,它提供类似toString()的方法并定义上面的内容以要求Printable 。 (这可以避免当新手试图打印不重载toString()的对象时出现的困惑)。

但是, print (etc)和+连接只适用于所有内容,这非常方便。 而且我确信这就是为什么Java是这样设计的。

编辑 – 回应OP的后续问题:

静态假设FromString vs Serialization:当然,但这是一个完全不同的故事,对吧?

假设我正在正确解析你的语法……

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

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