c# - 为什么 object.ToString() 没有反函数?

标签 c# .net parsing tostring

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

4年前关闭。




Improve this question



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

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

语言设计中不提供类似通用的基本原理是什么 object.FromString(string)方法?

其他问题和他们的回答讨论了可能的反对意见,但我发现它们没有说服力。

  • 解析可能会失败,而始终可以转换为字符串。
  • 好吧,那不保留Parse()现有的方法,是吗?如果异常处理被认为是一种不受欢迎的设计,仍然可以定义 TryParse() System.Object 的标准实现方法简单地返回 false,但是对于有意义的具体类型(例如,今天仍然存在此方法的类型),它会被覆盖。
  • 或者,至少有一个 IParseable 会很好。声明 ParseMe() 的接口(interface)或 TryParse()方法,按照 ICloneable .
  • Tim Schmelter 的评论 “自己动手”:这当然有效。但是我不能为本地类型编写通用代码,或者说,IPAddress如果我必须解析这些值;相反,我不得不求助于类型自省(introspection)或编写实现自定义接口(interface)的包装器,这要么维护不友好,要么乏味且容易出错。
  • 达米安评论:接口(interface)只能声明非静态函数 讨论的原因here埃里克·利珀特。这是一个非常有效的反对意见。一个静态TryParse()不能在接口(interface)中指定方法。虚拟ParseMe(string)方法虽然需要一个虚拟对象,但充其量是一个杂物,最坏的情况是不可能的(使用 RAII)。我几乎怀疑这是不存在这样一个接口(interface)的主要原因。取而代之的是复杂的类型转换框架,这是作为“静态接口(interface)”矛盾修饰法的解决方案提到的替代方案之一。

  • 但即使考虑到列出的反对意见,在我看来,类型系统或语言中缺乏通用解析工具也是一种尴尬的不对称,因为一般 ToString()方法存在并且非常有用。

    在语言/CLR 设计过程中是否讨论过这个问题?

    最佳答案

    It seems like a good design decision that the System.object class, and hence all classes, in .NET provide a ToString() method



    也许对你。对我来说,这似乎总是一个非常糟糕的主意。

    which, unsurprisingly, returns a string representation of the object.



    有吗?对于绝大多数类型,ToString 返回类型的名称。那是对象的字符串表示形式吗?

    不,ToString 一开始就是一个糟糕的设计。它没有明确的契约(Contract)。除了没有副作用和产生字符串之外,没有关于它的语义应该是什么的明确指导。

    由于 ToString 没有明确的约定,因此除了调试器输出之外,几乎没有任何东西可以安全地使用它。我是说真的,想想看:你最后一次调用 ToString 是什么时候? 对象 在生产代码中?我从来没有。

    因此,更好的设计应该是方法 static string ToString<T>(T)static string ToString(object)Debug类(class)。如果对象为空,则这些可能会产生“空”,或者对 T 进行一些反射以确定是否有该对象的调试器可视化器,依此类推。

    所以现在让我们考虑一下你的实际提议的优点,这是一个一般要求,即所有对象都可以从字符串中反序列化。注意首先,显然这不是 ToString 的逆运算。 ToString 的绝大多数实现都不会产生任何你可以使用的东西,即使在理论上可以用来重构对象。

    那么你的建议是 ToString 和 FromString 是相反的吗?然后,这要求每个对象不仅被“表示”为字符串,而且实际上可以往返序列化为字符串。

    让我们想一个例子。我有一个代表数据库表的对象。该表上的 ToString 现在是否序列化表的全部内容? FromString 是否反序列化它?假设对象实际上是一个连接的包装器,它按需获取表;那我们序列化和反序列化什么?如果连接需要我的密码,它是否将我的密码放入字符串中?

    假设我有一个引用另一个对象的对象,这样我就无法反序列化第一个对象而没有第二个对象。序列化是否跨对象递归?引用图包含循环的对象呢?我们如何处理这些?

    序列化很困难,这就是为什么有整个库都致力于它的原因。要求所有类型都可序列化和可反序列化是一项繁重的工作。

    即使假设我们想这样做,为什么还要把所有东西都串起来?字符串是一种糟糕的序列化数据类型。它们不能轻易地保存二进制数据,它们必须一次完全存在于内存中,它们不能超过十亿个字符,它们没有结构,等等。您真正想要的序列化是结构化的二进制存储系统。

    But even given the objections listed, the absence of a general parsing facility in the type system or language appears to me as an awkward asymmetry, given that a general ToString() method exists and is extremely useful.



    这是两个完全不同的东西,彼此没有任何关系。一个是一个 super 难题,最好由专门解决它的库来解决,另一个是一个微不足道的小调试辅助工具,没有规范限制其输出。

    Was that ever discussed during language/CLR design?



    是否讨论过 ToString?显然是;它得到了实现。曾经讨论过通用序列化库吗?显然是;它得到了实现。我不确定你在这里得到什么。

    关于c# - 为什么 object.ToString() 没有反函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42395155/

    相关文章:

    c# - SQL UPDATE 循环非顺序键

    c# - 在 Dapper.NET 中调整 CommandTimeout?

    c# - 未从路由 C# 接收数据

    java - 用java读取二进制文件时,如何?

    python - 减少python中markdown的功能

    c# - 显示 Html 字符串

    c# - 如何添加到表格单元格而不覆盖数据?

    c# - 购买混淆器?

    c# - 以数学方式确定小数值的精度和小数位数

    android - 在 Android 上解析/管理巨大 JSON 文件(~19MB)的最佳实践