我刚刚遇到一些覆盖 ToString()
并返回一些关键信息(不仅仅是调试信息)的代码。这种类型的用户调用 ToString()
并解析该关键数据。
我的观点是,根据多年来阅读的各种零碎内容,ToString()
有一个相当弱的contract
,即覆盖它(如果你想要)显示一些有意义的东西。
看到我说显示吗?我遇到的代码非常具体地依赖于这种类型实例的文本表示;添加预期之外的任何内容会导致各种问题。
所以,我的问题是,如果对象的文本表示很关键,应该使用 ToString()
还是应该使用更明确的方法/属性,例如AsText
?
最佳答案
这似乎是一个非常糟糕的计划。如果该类型的用户需要数据,那么该类型应该公开返回该数据的方法。为什么人们在可以访问对象时要解析对象的字符串表示形式?
当然有序列化场景,但那些都是明确定义的,很少使用 .ToString()
来完成他们的工作。
如果出于非输出目的需要字符串的文本表示,那么我更喜欢一个单独的方法(可能会也可能不会利用 ToString()
来完成它的工作。)这有助于消费者和实现者;如果新的编码人员想在 ToString()
中添加一些调试转储信息并破坏类的使用者,那将是非常不幸的。
更新:正如 MattDavey 指出的那样,如果您实现 IFormattable
,那么这是一个很好的折衷方案:您的消费者调用 ToString()
,但是考虑到特定的格式,以及这意味着什么的可靠契约(Contract)。仍然与您的同事正在做的不同,但可能更适合他们的选择。
关于c# - ToString 应该用于关键信息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7013155/