我刚刚遇到了一些覆盖ToString()
并返回一些关键信息(不仅仅是调试信息)的代码。这种类型的用户称为ToString()
,并解析关键数据。
我的观点是,从多年来阅读各种零碎的东西来看,ToString()
有一个相当弱的contract
,即覆盖它(如果你想)以显示一些有意义的东西。
看到我说的display there了吗?我遇到的代码依赖于这种类型实例的文本表示非常具体;添加任何超出预期的内容都会导致各种各样的问题。
所以,我的问题是,如果对象的文本表示是关键的,应该使用ToString()
还是应该使用更显式的方法/属性,例如AsText
?
这似乎是一个非常糟糕的计划。如果该类型的用户需要数据,那么该类型应该公开返回该数据的方法。当人们可以访问对象时,为什么要解析对象的字符串表示形式?
当然存在序列化场景,但这些场景是定义良好的,并且很少使用.ToString()
来完成它们的工作。
如果需要非输出目的的字符串的文本表示,那么我更倾向于使用一个单独的方法(可能使用也可能不使用ToString()
来完成它的工作)。这对消费者和实现者都有帮助;如果一个新的编码器想要在ToString()
中添加一些调试转储信息,并且破坏了类的消费者,那将是非常不幸的。
UPDATE:正如MattDavey指出的那样,如果你实现IFormattable
,那么这是一个很好的折衷方案:你的消费者调用ToString()
,但是要记住特定的格式,并且要可靠地约定这意味着什么。还是和你的同事做的不一样,但这可能是一个更适合他们的选择。
我个人也有同感。微软的文档声明ToString()
方法
[…]将对象转换为它的字符串表示形式,以便它适合显示。
Oracle关于Java的Object.toString()
的文档甚至更强:
结果应该是一个简洁但信息丰富的表示,便于人们阅读。
我认为这些强烈表明ToString()
应该传达方便人类的信息。返回将由应用程序的其他部分操作的数据的方法应该具有更具信息性的名称。在我看来,即使是AsText()
也太通用了。
我不认为有一个明确的答案。
我主张使用ToString()
,因为当在。net中创建API时,使用。net中的通用命名约定而不是使用不太熟悉的名称(如AsText()
)是值得赞赏的。例如,类StringBuilder
遵循这个约定,因为它的ToString()
返回关键信息。
问得好。
为了更明确,我会为不同的格式创建不同的方法。
示例:toJson() ->对象的JSON表示toXML() ->对象的XML表示。等
注意:可能有一个库可以为你做这些。在Java中有。不知道在c#
正如您所说,随着时间的推移,解析toString()可能会导致问题,因为新的开发人员可能不知道toString()具有特定的格式。
在我看来,ToString()
毕竟是一个方法,我们可以使用它在任何理想的的方式,例如5.ToString()
将int转换为字符串并返回它,无论它是否用于显示,相反,在许多情况下,我们依赖从int.ToString()
返回的信息来做进一步的操作。
毫无疑问,你的问题没有明确的答案。在我看来,像ToString
或AsText
这样的方法应该只用于提供对象的内部状态,例如记录它。在面向对象的语言中,函数方面应该通过使用定义良好的接口来派生,例如GetOrderId
, GetUserName
。
不,我不会那样做。例如,如果我有一个person对象,ToString()
可能会返回this.firstname + " " + this.lastname.
。它将其用于自动显示目的,例如向列表框中添加项。添加对象后,将显示此人的姓名。我认为我不会把关键或敏感的信息放在重写中。