问题是:

  • GUI库喜欢用 ToString 作为默认表示对于课程。在那里,它需要将本地化。
  • ToString 用于记录。没有它应该提供编程相关的信息,是没有翻译,包括内部这样的国家代理键和枚举,值。
  • ToString 是由许多使用串行动采取对象为参数,例如 String.Format, 当书写流。根据上下文,你期望什么不同。
  • ToString 太有限,如果有许多不同的陈述的相同目的,例如。一个长的和短的形式。

因为不同用法,有许多不同种类的实施。所以他们太不可靠的是真正有用的。

应该如何 ToString 实施是有用吗?时应 ToString 使用时应避免?


.净框架文件 说:

这种方法返回的人阅读的 字符串的文化敏感性。

还有一个 类似的问题, 但不相同。

有帮助吗?

解决方案

看来你有很大的期望从一个小小的的方法:)尽我知道这不是个好主意使用一般的方法在如此多不同的上下文中,特别当其行为可以从不同类的分类。

这是我的建议:

1.不要让GUI图书馆使用ToString()对你的对象。而不是使用更有意义的性质(几乎所有的控制可以定制,以显示其他特性比ToString) 例如使用DisplayMember.2.当得到的一些信息的对象(用于记录或其他用途)让别人决定(另一个目的或对象本身)应该是什么提供了及如何应当显示出来。(一战略的模式可以派上用场)

其他提示

这里是一个很好的篇文章,其中解释了 压倒一切的系统。对象。ToString()以及执行IFormattable

它取决于indended使用的类。许多类没有一个自然串表示(即一种形式对象)。然后我会实现ToString作为一个内容丰富的方法(成文字,大小等)可用时调试。如果该类是为提供信息的用户然后我会实现ToString作为默认表示的价值。如果你有一矢量的对象例如,然后ToString可能返回的矢量,作为一个X和Y坐标。在这里,我还要补充的替代方法,如果还有其他的方式来描述类。因为矢量我可能会添加一个方法,该方法返回描述为一个角度和长度.

进行调试的目的,你可能还需要添加DebuggerDisplay属性。这告诉我们如何显示这类调试器,但这并不影响串的代表性。

你可能还需要考虑返回的值ToString是可解析的,这样就可以创建一个对象从一串的代表性。喜欢,你可以做的Int32。分析方法。

另一种除皱的是考虑之间的紧密集成ToString和Visual Studio的调试器。该表显示窗口的结果ToString作的价值表达,所以,如果你的方法执行任何延迟装载,任何副作用,或者需要很长的时间,然后你可以看见奇怪的行为或调试器可能出现。当然,这些素质是不是该商标的一个设计良好的ToString的方法,但是它们发生(例如一个天真"取的翻译数据库"实现)。

因此,我认为默认的ToString方法(没有参数)将一些工作室调试钩--的含义,它应一般不会超载使用的程序以外的调试的上下文。

虽然这些知识的杠杆作用调试性(DebuggerTypeProxyAttribute,Ide,DebuggerBrowsableAttribute)定制的调试器,许多人(包括我自己)的一般考虑的默认输出作为产生的ToString并显示在看窗够好。

我的理解是,这是一个相当严格的角度--写关ToString作为一个调试器钩-但我发现,执行IFormattable似乎是更可靠和可扩展的路线。

就个人而言,我不执行ToString,往往。在许多情况下,它不会使整个很大的意义,因为一个类型是主要的角色 可以定义的行为,没有数据。在其他情况下,它只是没关系因为没有客户的需要。

在任何情况下,这里有一些情况下是有意义的(未详尽列出):

  • 如果结果的ToString可以想到的是分析回到类型的实例,而不会丢失数据。
  • 当类型有一个简单的(即不复杂的)价值。
  • 当主要目的的该类型的格式化数据纳入文本。

我不同意那里是一个冲突之间的使用情况,你的清单。当显示是主要的目的,ToString应该提供一个用户友好的文本,但用于登录(或者说,如你所描述的,用于跟踪)我要说的是,你不应该追踪一个UI-特定要素在任何情况下,而是一个目,其目的是编写详细的跟踪数据。

因此,没有冲突,因为它不应该被同一类型根据对单一责任的原则。

记住,你总是可以重载ToString方法如果你需要更多的控制。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top