过去我曾适度使用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序列化:当然,但这是一个完全不同的故事,对吗?
答案 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)
我想只是为了调试目的,任何对象都可以有一个字符串表示只是被认为是有用的...