为什么对object.tostring()没有逆



似乎是一个很好的设计决策,System.Object类以及.NET中的所有类都提供了ToString()方法,毫不奇怪,它返回对象的字符串表示。此外,在C#中,此方法是针对本地类型实现的,因此它们与类型系统很好地集成。

当需要用户互动时,这通常会派上用场。例如,对象可以直接保存在GUI小部件(例如列表)中,并"自动"显示为文本。

语言设计中不提供类似一般object.FromString(string)方法的理由是什么?

其他问题及其答案讨论了可能的反对意见,但我发现他们不说服。

  • 解析可能会失败,而转换为字符串是可能的。

    • 好吧,这并不能保留Parse()现有方法,是吗?如果例外处理被认为是一种不良设计,则仍然可以定义TryParse()方法,其标准实现System.Object只是返回false,但对于有意义的具体类型而言,它被覆盖了(例如,无论如何,无论如何,无论如何此方法存在的类型)。

    • 另外,至少拥有一个IParseable接口,该接口沿ICloneable的行声明ParseMe()TryParse()方法。

  • Tim Schmelter的评论"滚动您自己的":当然可以。但是我不能为本机类型编写一般代码,或者,如果必须解析值,例如IPAddress;相反

  • Damien的评论:一个接口只能声明非静态功能出于Eric Lippert在此处讨论的原因。这是一个非常有效的异议。接口中无法指定静态TryParse()方法。一种虚拟的ParseMe(string)方法虽然需要一个虚拟对象,这是最多是一个kludge,而最坏的情况(使用RAII)。我几乎怀疑这是这种接口不存在的主要原因。取而代之的是精心构造的转换框架,这是"静态接口"矛盾的解决方案之一。

,但即使列出了反对意见,鉴于存在一般的ToString()方法并且非常有用。

是在语言/CLR设计期间讨论过的吗?

system.Object类,因此所有类都提供了.NET中的所有类,这似乎是一个很好的设计决策。

也许对你。对我来说,这似乎总是一个坏主意。

毫不奇怪,它返回对象的字符串表示。

是吗?对于绝大多数类型,ToString返回该类型的名称。对象的字符串表示如何?

不,首先,ToString是一个糟糕的设计。它没有明确的合同。除了没有副作用并产生字符串之外,还没有明确的指导。

由于ToString没有明确的合同,因此除了 debugger outputs 外,几乎没有什么可以安全地使用它的。我的意思是说,想一想: production 代码中的对象上一次打电话给 ToString 是什么时候?我从来没有。

因此,更好的设计将是Debug类中的方法static string ToString<T>(T)static string ToString(object)。如果对象为null或对t进行了一些反射,则可能会产生" null",以确定该对象是否有调试器可视化器。

因此,现在让我们考虑一下您实际建议的优点,这是所有对象都可以从字符串中进行审理的一般要求。请注意,首先,这显然不是to绳的反作用。绝大多数的tostring实施也不会产生您即使在理论上重建对象也可以使用的任何东西。

那么,您提出的提议是tostring和string是反转的吗?这样就要求每个对象不仅被"表示"为字符串,而且实际上是sermializable 的字符串。

让我们考虑一个例子。我有一个代表数据库表的对象。该表上的ToString现在是否将表的整个内容序列化?从串中挑剔吗?假设对象实际上是围绕按需获取表格的连接的包装器;那么,我们序列化和序列化是什么?如果连接需要我的密码,是否将密码放入字符串中?

假设我有一个指代另一个对象的对象,这样我就无法在不掌握第二个对象的情况下对第一个对象进行估算。跨物体的序列化递归吗?参考图包含循环的对象呢?我们如何处理这些?

序列化很困难,这就是为什么整个库都专门介绍了它的原因。使所有类型都可以序列化且值得注意。

甚至假设我们想这样做,为什么所有事物的 string ?字符串是可怕的序列化数据类型。他们不能轻易持有二进制数据,必须一次完全存在记忆中,它们不能超过十亿个字符的顶部,它们没有结构,等等。您真正想要的序列化是一个结构化的二进制存储系统。

,但即使列出了反对意见,鉴于我的类型系统或语言中缺少一般解析设施是一种尴尬的不对称性,鉴于存在一般的toString()方法,而且非常有用。

这是两个完全不同的事物,它们彼此无关。一个是一个专门针对它的库最好解决的超级困难问题,另一个是一个微不足道的小调试辅助工具,没有规格来限制其输出。

是在语言/CLR设计中讨论过的吗?

曾经讨论过to刺吗?显然是;它得到了实施。是否曾经讨论过广泛的序列化库?显然是;它得到了实施。我不确定您要在这里得到什么。

为什么object.ToString()没有倒数?

因为object应保留每个对象所需的裸露最小功能。将平等和转换为字符串(出于很多原因)是其中两个。转换不是。问题是:它应该如何转换?使用JSON?二进制?xml?还有其他吗?没有一种从字符串转换的统一方法。因此,这将不必要地膨胀object类。

另外,至少拥有一个可观的接口

很高兴

例如: IXmlSerializable或许多替代方案之一。

相关内容

最新更新