【问题标题】:What are the original reasons for ToString() in Java and .NET?Java 和 .NET 中 ToString() 的最初原因是什么?
【发布时间】:2011-01-19 10:57:57
【问题描述】:

我过去曾适度使用过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 与序列化:当然,但那是完全不同的故事,对吧?

【问题讨论】:

  • FromString = 序列化反序列化?
  • 当然,但不是那么直接,对吧?
  • 好问题,当然System.Object.ToString() 值得商榷:csharptest.net/?p=346
  • 不作为答案,因为这是猜测:他们必须选择放置它的地方,并且仅为 toString 添加一个接口(在 Java 中,因为它来自那里)感觉有点矫枉过正。例如: Console.WriteLine(string format, params IStringConvertable[] args);在 hello world 应用程序中令人困惑 :)

标签: java .net tostring


【解决方案1】:

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

【讨论】:

  • 当然可以,但它被称为 toString() - 小写首字母。
  • 这只是意味着同一个问题与Java有关。
  • 问题仍然存在。为什么 Java 设计者会这样做,或者 Java 的设计者从什么语言中获取它,为什么他们或 .NET 设计者不改变它。
  • @Rune - 或许更是如此。
  • +1。在 Java 的情况下,这个问题会更相关。我强烈怀疑 C# 和 .NET 只是添加了它,因为它们需要类似于 Java。 .NET 和System.Object 以这种方式从 Java 中采用了很多杂乱无章的东西。 System.Object 类的大多数成员不应该在那里。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      作为替代方案,本来可以定义一个接口(比如)Printable,该接口提供了类似toString() 的方法,并定义了上述方法以要求Printable。 (这将避免当新手尝试打印不会超载toString() 的对象时出现的困惑。)

      然而,print (etc) 和 + 连接对所有事情都有效,这真的很方便。我确信这就是 Java 采用这种方式设计的原因。

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

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

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

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

      【讨论】:

      • 这里有回声吗? ;) 检查我对 OP 的评论。赞成。
      • 无回声。我不会将类似 Printable 的界面称为“矫枉过正”。这只是错误的解决方案,IMO。
      • “对象序列化的目标......”。当然。不过题外话。
      • @d - 你没有读过OP的问题“(B)”吗????他(如果我正确地阅读了他的问题)在询问 toString() / fromString() 是否是对象序列化的可行替代方案。而我的回答是,基本上不会。
      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 2010-10-31
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      相关资源
      最近更新 更多