C# 为我的自定义对象提供ToString()
我有一个有很多很多很多属性的类。 在我的程序中,我必须大量登录。我经常不得不手动操作 构建日志字符串,如C# 为我的自定义对象提供ToString(),c#,.net,string,C#,.net,String,我有一个有很多很多很多属性的类。 在我的程序中,我必须大量登录。我经常不得不手动操作 构建日志字符串,如 string log = "Current state of object:" + "Property1" + myObj.Property1 + ... 我只是想,如果覆盖ToString并提供我所需的任何日志,该怎么办。这被认为是愚蠢的做法 如何提供格式化程序控制字符串?假设我希望我的ToString在两种模式下运行 一个是所有属性的完整输出,另一个是仅输出相关属性的轻型版本 类似My
string log = "Current state of object:" + "Property1" + myObj.Property1 + ...
ToString
并提供我所需的任何日志,该怎么办。这被认为是愚蠢的做法李>
string x=myObject
;您必须显式调用ToString重写
ToString
确实是一种很好的做法,只要您提供了良好的信息
至于使用不同类型的ToString
——这是可能的,但是您将不会重写ToString
,而是提供一个重载(任何使用类都需要知道)
我将实现轻量级
版本作为覆盖,并为全套属性创建VerboseToString
函数
如果您有许多这样的对象,可以使用
VerboseToString
方法创建IVerboseString
接口,并在对象中实现它。通过这种方式,您可以在日志记录中简单地使用接口引用。为什么要重写ToString,而不是创建一个以Enum为参数并在内部执行所需操作的方法?我想不出与之相关的任何特定问题,我自己也很欣赏它在单元测试或跟踪等过程中吐出信息。但是我对你的实现的冗长和简洁的输出表示异议——不要使用巫毒字符串或任何类型的任意输入——我更喜欢这里的id,你要么接受一个输入参数bool verbose
,要么显式地创建一个ToStringVerbose()
方法。对于被重写的方法来说,将base.ToString()
作为其实现的一部分也是一种很好的做法。i始终重写.ToString以进行调试。我看没问题。同上。重写ToString()在中提供了更好的“监视”窗口,而不是将其作为注释发布,因为OP明确地没有提到调试器,而是日志文件等:如果您只关心调试器(监视),那么最好使用DebuggerDisplayAttribute()。此外,过于复杂的ToString()操作可能会减慢调试器的速度,因为它们经常(重新)求值,或者导致异常,而您什么也看不到。枚举与此有什么关系???@RPM1984-我想这比巫毒魔常数更好?但我也不喜欢这里。IVerbose接口的重用性更强。@RPM1984:OP说他需要2个操作(完整和基本)。我不会重写ToString,但会为此编写一个新方法,因为您不能重写ToString并将该枚举添加为参数。对,我误解了。我的坏朋友。:)是的,如果我想要兼容性,我会覆盖ToString;如果我想要“功能”@Captain Comic,我会提供MyOwnOutput()——你可以同时做这两件事:)