Ste*_*unn 6 .net c# framework-design
我刚刚遇到一些覆盖ToString()并返回一些关键信息(不仅仅是调试信息)的代码.此类用户调用ToString()并解析该关键数据.
我的意见,从多年来阅读各种各样的点点滴滴,是ToString()有一个相当弱的contract,即覆盖它(如果你想)显示一些有意义的东西.
看到我说那里的显示器?我遇到的代码依赖于此类实例的文本表示非常具体; 添加除预期之外的任何东西都会导致各种各样的问题.
所以,我的问题是,如果一个对象的文本表示是关键的,应该ToString()使用还是应该使用更明确的方法/属性,例如AsText?
这似乎是一个非常糟糕的计划.如果该类型的用户需要数据,那么该类型应该公开返回该数据的方法.为什么人们在有权访问对象时解析对象的字符串表示?
当然有序列化方案,但这些方案定义明确,很少用于.ToString()完成它们的工作.
如果需要用于非输出目的的字符串的文本表示,那么我宁愿使用单独的方法(可能会也可能不会ToString()用于完成其工作.)这有助于消费者和实现者; 如果一个新的编码器想要添加一些调试转储信息ToString()并打破该类的消费者,那将是非常不幸的.
更新:正如MattDavey指出的那样,如果你实施IFormattable,那么这是一个很好的妥协:你的消费者打电话ToString(),但考虑到特定的格式,以及这意味着可靠的合同.仍然不同于你的同事正在做的事情,但是一个可能更适合他们的选择.