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

时间:2010-02-21 23:26:06

标签: java .net tostring

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

有谁知道具体原因是什么?我错过了很多ToString()证明有用的情况,以便成为ToString()的一部分吗? System.Object的原始原因是什么?

非常感谢!

PS - 再说一遍:我不是在质疑这个方法,也不是暗示它没有用,我只是想知道是什么让它变得有用,因为它被放置在ToString()中。

旁注 - 想象一下:

System.Object

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

这不是很酷吗?

EDIT(1):

(A) - 基于一些答案,似乎.NET语言从Java继承了这一点。所以,我正在为主题和标签添加“Java”。如果有人知道为什么用Java实现了这个原因,请稍微阐明一下!

(B) - 静态假设AnyDotNetNativeClass initialObjectFullCopy = AnyDotNetNativeClass.FromString(someInitialObject.ToString()); vs序列化:当然,但这是一个完全不同的故事,对吗?

4 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

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

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

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

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

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

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

  

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

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

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

答案 3 :(得分:1)

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