为我的自定义对象提供ToString()

时间:2010-12-16 11:07:20

标签: c# .net string

我有一个有很多很多属性的课程。 在我的程序中,我必须重重记录。我经常需要手动 构建日志字符串,如

string log = "Current state of object:" + "Property1" + myObj.Property1 + ...
  1. 我只是想如果覆盖ToString并提供我需要的任何记录。它被认为是goog练习?
  2. 如何提供格式化程序控件字符串?说我希望我的ToString以两种模式运行 一个是所有属性的完全输出和另一个轻型版本,只输出相关属性
  3. 像MyObj.ToString(“full”)和MyObj.ToString(“basic”)

4 个答案:

答案 0 :(得分:4)

覆盖ToString确实是一种很好的做法,只要您提供良好的信息。

至于具有不同类型的ToString - 这是可能的,但是你不会覆盖ToString,而是提供重载(任何使用类都需要了解)。

我会将lightweight版本实现为覆盖,并为整套属性创建VerboseToString函数。

如果您有许多此类对象,则可以使用IVerboseString方法创建VerboseToString接口,并在对象中实现它。这样,您只需在日志记录中使用接口引用即可。

答案 1 :(得分:1)

  1. 这是一个很好的做法
  2. 当然,你可以参数化ToString方法,但它不再意味着从对象到字符串的隐式转换,所以你不能写,比如string x = myObject;你必须明确地调用ToString。

答案 2 :(得分:1)

为什么要覆盖ToString但不创建一个以Enum作为参数的方法并在你的内部做你想做的事情?

答案 3 :(得分:1)

我无法想到与之相关的任何特定问题,而我自己也经常感谢它在单元测试或跟踪等中吐出信息,但我会对您的实现提出冗长而简洁的输出问题 - 不要使用voodoo字符串或任何类型的任意输入 - 我更喜欢它在id中你要么输入参数bool verbose,要么你明确地创建了一个ToStringVerbose()方法。对于您的重写方法,使用base.ToString()作为其实现的一部分,这也是恕我直言的好习惯。