我刚刚遇到一些覆盖ToString()
并返回一些关键信息(不仅仅是调试信息)的代码。此类用户称为ToString()
并解析该关键数据。
我的意见,多年来阅读各种各样的点点滴滴,ToString()
有一个相当弱的contract
,即覆盖它(,如果你想要)到显示一些有意义的东西。
看到我说显示吗?我遇到的代码依赖于此类实例的文本表示非常具体;添加除预期之外的任何东西都会导致各种各样的问题。
所以,我的问题是,如果一个对象的文本表示是关键的,应该使用ToString()
,还是应该使用更明确的方法/属性,例如AsText
?
答案 0 :(得分:6)
这似乎是一个非常糟糕的计划。如果该类型的用户需要数据,那么该类型应该公开返回该数据的方法。为什么人们在有权访问对象时解析对象的字符串表示?
当然有序列化方案,但这些方案定义明确,很少使用.ToString()
来完成它们的工作。
如果需要用于非输出目的的字符串的文本表示,那么我更喜欢单独的方法(可能会或可能不会利用ToString()
来完成它的工作。)这有助于消费者和实现者;如果一个新的编码器想要在ToString()
中添加一些调试转储信息并打破该类的消费者,那将是非常不幸的。
更新:正如MattDavey指出的那样,如果您实施IFormattable
,那么这是一个很好的妥协:您的消费者致电ToString()
,但考虑到特定的格式,并且可靠这意味着什么。仍然不同于你的同事正在做的事情,但这个选项可能更适合他们。
答案 1 :(得分:4)
我个人也有同感。 Microsoft's documentation声明了ToString()
方法
Java[...]将对象转换为其字符串表示形式,以便适合显示。
Object.toString()
的Oracle's documentation甚至更强一些:
结果应该是一个简洁但信息丰富的表示,便于人们阅读。
我认为这些强烈表明ToString()
应该传达方便人类的信息。返回由应用程序的其他部分操纵的数据的方法应该具有更多信息的名称。在我看来,即使AsText()
过于通用。
答案 2 :(得分:1)
我认为没有明确的答案。
我会争论使用ToString()
的情况,因为在.NET中创建API时,如果使用.NET中的常见命名约定,而不是使用不太熟悉的名称,例如{{1} }。
例如,类AsText()
遵循此约定,因为其StringBuilder
正在返回关键信息。
答案 3 :(得分:1)
好问题。
为了更明确,我会为不同的格式创建不同的方法。
Ex:toJson() - >对象的JSON表示 toXML() - >对象的XML表示。 ...等
注意:可能有一个库为你做这个..在java中有。不知道在c#
正如你所说,解析toString()可能会导致问题,因为新的开发人员可能不知道toString()具有特定的格式。
答案 4 :(得分:0)
在我看来ToString()
毕竟是一种方法,我们可以用任何理想的方式使用它,例如5.ToString()
将int转换为字符串并返回它无论如何如果它是用于显示或不用,相反,在许多情况下,我们依赖来从int.ToString()
返回的信息进行进一步的操作。
答案 5 :(得分:0)
毫无疑问,你的问题没有明确答案。在我看来,ToString
或AsText
等方法只应用于提供对象的内部状态,例如:记录它。在面向对象的语言中,功能方面应该通过使用明确定义的接口来导出,例如, GetOrderId
,GetUserName
。
答案 6 :(得分:0)
不,我不会那样做。例如,如果我有一个人物对象,ToString()
可能会返回this.firstname + " " + this.lastname.
它会将其用于自动显示目的,例如将项目添加到列表框中。添加对象后,将显示此人的姓名。我不认为我会在重写中放置关键或敏感信息。