c# - ToString 应该用于关键信息吗?

标签 c# .net framework-design

我刚刚遇到一些覆盖 ToString() 并返回一些关键信息(不仅仅是调试信息)的代码。这种类型的用户调用 ToString() 并解析该关键数据。

我的观点是,根据多年来阅读的各种零碎内容,ToString() 有一个相当弱的contract,即覆盖它(如果你想要)显示一些有意义的东西。

看到我说显示吗?我遇到的代码非常具体地依赖于这种类型实例的文本表示;添加预期之外的任何内容会导致各种问题。

所以,我的问题是,如果对象的文本表示很关键,应该使用 ToString() 还是应该使用更明确的方法/属性,例如AsText?

最佳答案

这似乎是一个非常糟糕的计划。如果该类型的用户需要数据,那么该类型应该公开返回该数据的方法。为什么人们在可以访问对象时要解析对象的字符串表示形式

当然有序列化场景,但那些都是明确定义的,很少使用 .ToString() 来完成他们的工作。

如果出于非输出目的需要字符串的文本表示,那么我更喜欢一个单独的方法(可能会也可能不会利用 ToString() 来完成它的工作。)这有助于消费者和实现者;如果新的编码人员想在 ToString() 中添加一些调试转储信息并破坏类的使用者,那将是非常不幸的。

更新:正如 MattDavey 指出的那样,如果您实现 IFormattable,那么这是一个很好的折衷方案:您的消费者调用 ToString(),但是考虑到特定的格式,以及这意味着什么的可靠契约(Contract)。仍然与您的同事正在做的不同,但可能更适合他们的选择。

关于c# - ToString 应该用于关键信息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7013155/

相关文章:

.net - Visual Studio 2013 : Creating a new ASP. 没有 nuget 的网络项目

c# - 为什么我可以锁定 C# 中的任何对象类型?

c# - DataTable 动态计算列

c# - 是否可以在不同的 API 中关联相同的音频设备?

c# - 无法将 lambda 表达式转换为委托(delegate)类型 'System.Func<T,TKey>'

c# - 尝试在 Service Fabric 中容器化和发布 StatelessService 时出现异常

c# - 空字符串 ""何时是有效的日期时间字符串格式?

c# - WPF:从 XAML 设置 ViewModel,为什么第二个解决方案不起作用?