【问题标题】:Is it ok to override ToString() method in this case在这种情况下是否可以覆盖 ToString() 方法
【发布时间】:2014-07-07 13:25:35
【问题描述】:

我需要能够检索对象的字符串版本。

例如:SearchCriteria 下方应提供“Search Parameters: FromDate:{0}, ToDate {1}, ..

public class SearchCriteria
{
  public string FromDate {get;set;}
  public string ToDate {get;set;}
  public string FromAge {get;set;}
  public string ToAge {get;set;}

  //other 10 properties
}

但是从我阅读的其他线程来看,由于性能问题,不建议将 ToString() 用于长字符串。我想知道这样使用是否可以,或者我应该考虑使用私有方法。

编辑

此字符串表示在业务逻辑中使用,不用于调试目的。

【问题讨论】:

  • 这就是 toString 的作用,它会在被调用时被评估,所以没有性能问题
  • 如果你没有十几个不相关的东西向这些对象询问它们的字符串表示,那么它应该没关系。

标签: c# .net overriding tostring


【解决方案1】:

来自documentation: "返回一个代表当前对象的字符串。"

如果你想创建一个字符串来表示对象,那就是这个地方。

所以 - 是的!

编辑:

“此字符串表示在业务逻辑中使用,不用于调试目的。”

int 的字符串表示也用于业务逻辑。问题是该字符串表示是特定于该业务逻辑,还是只是您在业务逻辑中使用的该对象的一般表示。

如果它特定于该特定业务逻辑,则字符串的生成假设是该业务逻辑的一部分。

如果没有,但该对象有许多可选的字符串表示,您可能希望实现IFormattable,它定义了一个ToString 方法,该方法获取IFormatProvider 和格式字符串作为参数。

否则,普通的ToString 就是你的朋友。

【讨论】:

    【解决方案2】:

    是的,绝对覆盖 ToString() 以返回最有意义的信息。

    我认为太长的字符串可能会导致一些问题并且不太有用。例如,较长的字符串在 Watch Window 中没有空间并且可能有其他考虑。所以我会寻找一种方法来缩短输出并且仍然有意义。

    但无论如何,请覆盖 ToString(),以便您自己的类型返回有意义的信息。

    【讨论】:

      【解决方案3】:

      与其担心ToString() 的性能,我会关注可读性和预期行为。

      我一直使用ToString()来实现对象的人性化显示。也就是说,即使调用者对我的类一无所知(例如,写入日志或控制台,甚至显示在 UI 中),我总是希望如何显示对象。

      对于特定于操作的实现,我会实现另一个函数,但遵循类似的命名模式。说,ToFormattedQueryString()

      这里有一个很好的关于 ToString() 的经验法则的讨论:Why / when would it be appropriate to override ToString?

      【讨论】:

        【解决方案4】:

        如果您担心性能,可以在类中添加字段来存储字符串,然后为每个属性添加代码到set,以便在该点重新计算您的字符串。那么ToString()就可以高效了。

        就个人而言,我认为额外的代码和一直重新计算该字符串的开销(可能永远不会使用)并不能证明更改的合理性。

        我的建议是,由于性能是您最关心的问题,请继续按照想要编写的方式编写代码,以您觉得更清晰、更简洁的方式编写代码。最易于维护,然后让 profiler 工具告诉您需要返回和优化的位置。

        【讨论】:

          【解决方案5】:

          没有。

          当然没问题。从某种意义上说,尿裤子是“好的”。 5 秒钟是温暖的,缓解感觉很好。但是你需要干净的裤子。

          从某种意义上说,它与松散类型非常相似,这是不好的。 'ToString 的实现在框架中的一般对象中大不相同,在所有不同工具和业务开发人员创建的对象中更具体。

          我的 2 美分:给它一个描述性的名称,因为很可能,稍后您将需要同一对象的另一个字符串表示形式。如果您开发 API,它的可读性更高,并且以后对您来说也更具可读性。

          【讨论】:

            猜你喜欢
            • 2021-07-10
            • 1970-01-01
            • 2014-10-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-01
            相关资源
            最近更新 更多