【发布时间】:2017-07-12 17:14:58
【问题描述】:
System.Object 类以及 .NET 中的所有类都提供了一个 ToString() 方法,这似乎是一个很好的设计决策,不出所料,该方法返回对象的字符串表示形式。此外,在 C# 中,此方法是针对本机类型实现的,以便它们与类型系统很好地集成。
当需要用户交互时,这通常会派上用场。例如,对象可以直接保存在 GUI 小部件(如列表)中,并“自动”显示为文本。
语言设计中不提供类似通用的object.FromString(string) 方法的理由是什么?
其他问题及其答案讨论了可能的反对意见,但我发现它们没有说服力。
-
解析可能会失败,但始终可以转换为字符串。
嗯,这并不能阻止
Parse()方法的存在,是吗?如果异常处理被认为是一种不受欢迎的设计,仍然可以定义一个TryParse()方法,其System.Object的标准实现只返回false,但是对于有意义的具体类型(例如,今天仍然存在该方法的类型) )。或者,至少有一个
IParseable接口会很好,该接口声明ParseMe()或TryParse()方法,类似于ICloneable。
Tim Schmelter 的 “Roll your own”评论: 当然可以。但是我不能为原生类型编写通用代码,或者说,如果我必须解析值,
IPAddress;相反,我不得不求助于类型自省或编写实现自定义接口的包装器,这要么维护不友好,要么繁琐且容易出错。Damien 的评论:接口只能声明非静态函数,原因由 Eric Lippert here 讨论。这是一个非常有效的反对意见。不能在接口中指定静态
TryParse()方法。一个虚拟的ParseMe(string)方法虽然需要一个虚拟对象,但充其量是一个杂物,最坏的情况是不可能的(使用 RAII)。我几乎怀疑这是不存在这样一个接口的主要原因。取而代之的是复杂的类型转换框架,这是作为“静态接口”矛盾修饰法的解决方案提到的替代方案之一。
但即使考虑到列出的反对意见,在我看来,类型系统或语言中缺少通用解析工具也是一种尴尬的不对称,因为通用 ToString() 方法存在并且非常有用。
在语言/CLR 设计期间是否讨论过这个问题?
【问题讨论】:
-
为了让
IParsable工作,您需要先获取一个实例。如果您的问题是“将此字符串转换为 X 的实例”,那么您首先需要获取 X 的其他一些实例才能调用FromString()感觉有点尴尬。 -
默认行为到底是什么,只是抛出一个异常?
-
您只能将少数类型从字符串转换为
OtherType,但您可以将每种类型转换为string。它有什么好处?如果需要并且可能的话,您始终可以提供从字符串创建实例的构造函数或工厂方法(例如,使用TryParse模式)。 -
请参阅this post 回答您的问题。