ToString应该用于关键信息吗?

Ste*_*unn 6 .net c# framework-design

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

我的意见,从多年来阅读各种各样的点点滴滴,是ToString()有一个相当弱的contract,即覆盖它(如果你想)显示一些有意义的东西.

看到我说那里的显示器?我遇到的代码依赖于此类实例的文本表示非常具体; 添加除预期之外的任何东西都会导致各种各样的问题.

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

dle*_*lev 6

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

当然有序列化方案,但这些方案定义明确,很少用于.ToString()完成它们的工作.

如果需要用于非输出目的的字符串的文本表示,那么我宁愿使用单独的方法(可能会也可能不会ToString()用于完成其工作.)这有助于消费者和实现者; 如果一个新的编码器想要添加一些调试转储信息ToString()并打破该类的消费者,那将是非常不幸的.

更新:正如MattDavey指出的那样,如果你实施IFormattable,那么这是一个很好的妥协:你的消费者打电话ToString(),但考虑到特定的格式,以及这意味着可靠的合同.仍然不同于你的同事正在做的事情,但是一个可能更适合他们的选择.


Nic*_*tti 4

我个人也有同样的担忧。微软的文档指出该ToString()方法

[...] 将对象转换为其字符串表示形式,以便适合显示。

Oracle 的Java文档Object.toString()更强大一点:

结果应该是简洁但信息丰富的表示形式,易于人们阅读。

我认为这些都是强有力的迹象,ToString()应该传达对人类来说方便的信息。返回由应用程序其他部分操作的数据的方法应该有一个更具信息性的名称。在我看来,甚至AsText()太通用了。