我想知道在包含Remove方法的类实例的一般.NET编程中有什么更好的做法。
问题是: 如果我有一个带有一些数据的StringBuilder sb,使用.Remove(0,sb.Length)是否更聪明,或者创建一个新实例并将旧版本保留给GC进行收集。我知道有很多因素,所以我想知道你对这个因素的看法。
谢谢,
三晋
答案 0 :(得分:2)
我肯定会创建一个新实例,直到探查器显示这是您应用程序中最关键的部分。
这种微优化类型的重用只会让任何读者都对代码的意图感到困惑。
答案 1 :(得分:2)
通常,创建一个新的。
.NET内存系统适用于快速创建和取消分配大量小型短期对象。 StringBuilder.Remove()可能会更慢。
对于非常大的数据(超过80kB),规则会有一些变化,具体取决于很多因素。
答案 2 :(得分:1)
请勿使用.Remove(0, sb.Length)
使用.Clear()
。它更容易阅读,如果没有为此特殊用例优化删除,Clear
也会更快。
或者只是分配一个新的StringBuilder。 StringBuilder本身很轻巧,所以我不认为使用新的会很贵
我通常不会区分Clear()
并根据一个的性能优势分配新的StringBuilder,但是会在其上创建更好的可读代码。这取决于您的用例。除非您的分析师证明有必要,否则不要进行微观优化
根据我的经验,您在某个方法的开头分配一个新的StringBuilder,并在生成函数的返回值时仅调用ToString
。在这种情况下,复制函数接口只是为了重用StringBuilder是愚蠢的。
我认为当你调用ToString()
时,StringBuilder会发出它的内部信息,所以内部缓冲区变得不可变,而StringBuilder需要在下一次更改时分配一个新的。
如果您确切地知道(或至少是下限)结果将持续多长时间,那么一个有用的微优化就是将容量传递给StringBuilder的构造函数。然后它不必以多个步骤增长数组。例如,如果您知道输出将至少为10000个字符,则可以将构建器初始化为10000个容量。