关闭。这个问题是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
. IPAddress
如果我必须解析这些值;相反,我不得不求助于类型自省(introspection)或编写实现自定义接口(interface)的包装器,这要么维护不友好,要么乏味且容易出错。 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/