Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为我的自定义对象提供ToString()_C#_.net_String - Fatal编程技术网

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
    并提供我所需的任何日志,该怎么办。这被认为是愚蠢的做法
  • 如何提供格式化程序控制字符串?假设我希望我的ToString在两种模式下运行 一个是所有属性的完整输出,另一个是仅输出相关属性的轻型版本
  • 类似MyObj.ToString(“full”)和MyObj.ToString(“basic”)的内容

  • 这是一个很好的练习
  • 当然,您可以参数化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()——你可以同时做这两件事:)