拥有一个不是更加优雅和整洁吗?IStringable
界面?
谁需要这个Type.FullName
对象返回给我们?
EDIT:每个人都一直问为什么我认为它更优雅..
嗯,就像这样,对象将具有 CompareTo 方法,而不是 IComparable,该方法默认抛出异常或返回 0。
有些对象不能也不应该被描述为字符串。对象可以同样返回string.Empty
. Type.FullName
只是一个随意的选择..
而对于像Console.Write(object)这样的方法,我认为应该是:Write(IStringable)。
但是,如果您将 WriteLine 用于除字符串之外的任何内容(或者其 ToString 很明显的内容,例如数字),那么在我看来,它仅用于调试模式。
顺便问一下 - 我该如何向大家发表评论?我可以发布答案吗?
恕我直言,有 3 个虚拟方法不应该添加到 System.Object 中......
- ToString()
- 获取哈希码()
- Equals()
所有这些都可以按照您建议的接口来实现。如果他们这样做了,我想我们的情况会好得多。那么为什么这些会成为问题呢?让我们只关注 ToString():
- 如果 ToString() 预计由使用 ToString() 的人实现并显示结果,则您有一个编译器无法强制执行的隐式契约。您假设 ToString() 已重载,但没有办法强制如此。
- 使用 IStringable,您只需将其添加到通用类型约束中或从中派生接口,以要求在实现对象时使用它。
- 如果您发现重载 ToString() 对调试器有好处,那么您应该开始使用 [System.Diagnostics.DebuggerDisplayAttribute]。
- 至于需要通过 String.Format() 和/或 Console.WriteLine 将对象转换为字符串的实现,他们可以推迟到 System.Convert.ToString(object) 并检查类似“IStringable”的内容,故障转移到类型的名称(如果未实现)。
- 正如克里斯托弗·埃斯特普(Christopher Estep)指出的那样,这是特定于文化的。
所以我想我独自一人在这里说我讨厌 System.Object 和所有它的虚拟方法。但我确实喜欢 C# 整体,总的来说,我认为设计师做得很好。
注意:如果您打算依赖 ToString() 重载的行为,我建议您继续定义 IStringable 接口。不幸的是,如果您确实需要该方法,则必须为该方法选择另一个名称。
more
我和我的同事刚刚就这个话题进行了交谈。我认为 ToString() 的另一个大问题是回答“它有什么用?”的问题。是显示文字吗?序列化文本?调试文本?完整的类型名称?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)