.net 删除vs新实例

.net 删除vs新实例,.net,stringbuilder,.net,Stringbuilder,我想知道在使用包含Remove方法的类实例进行.NET编程时,有什么更好的做法 问题是: 如果我有一个带有一些数据的StringBuilder sb,那么使用.Remove(0,sb.Length)还是创建一个新实例并将旧实例留给GC来收集更明智。我知道有很多因素,所以我想知道你对此的看法 谢谢 Sanjin我肯定会创建一个新实例,直到分析器显示这是应用程序中最关键的部分 这种微优化类型的重用只会让任何读者对代码的意图感到困惑。我肯定会创建一个新实例,直到分析器显示这是应用程序最关键的部分 这种

我想知道在使用包含Remove方法的类实例进行.NET编程时,有什么更好的做法

问题是: 如果我有一个带有一些数据的StringBuilder sb,那么使用.Remove(0,sb.Length)还是创建一个新实例并将旧实例留给GC来收集更明智。我知道有很多因素,所以我想知道你对此的看法

谢谢


Sanjin

我肯定会创建一个新实例,直到分析器显示这是应用程序中最关键的部分


这种微优化类型的重用只会让任何读者对代码的意图感到困惑。

我肯定会创建一个新实例,直到分析器显示这是应用程序最关键的部分


这种微观优化的重用只会让任何读者对代码的意图感到困惑。

一般来说,创建一个新的

NET内存系统旨在快速创建和取消分配大量小型、短期对象。StringBuilder.Remove()的速度可能较慢


对于非常大的数据(超过80kB),规则会发生一些变化,这取决于许多因素。

通常,创建一个新的规则

NET内存系统旨在快速创建和取消分配大量小型、短期对象。StringBuilder.Remove()的速度可能较慢

对于非常大的数据(超过80kB),规则会发生一些变化,这取决于许多因素。

不要使用
。删除(0,sb.Length)
使用
.Clear()
。它更容易阅读,而且如果没有针对这个特殊用例优化Remove,
Clear
也会更快。
或者只分配一个新的StringBuilder。StringBuilder本身是轻量级的,因此我认为使用新的不会很昂贵。
我通常不会根据StringBuilder的性能优势来区分
Clear()
和分配一个新的StringBuilder,而是根据它来创建可读性更好的代码。这取决于您的用例。不要进行微优化,除非您的profiler已经证明这是必要的。
根据我的经验,您可以在某个方法的开头分配一个新的StringBuilder,并且在生成函数的返回值时只调用
ToString
。在这种情况下,仅仅为了重用StringBuilder而使函数接口复杂化是愚蠢的

我认为当您调用
ToString()
时,StringBuilder会给出它的内部缓冲区,因此内部缓冲区变得不可变,StringBuilder需要在下一次更改时分配一个新的缓冲区

如果您确切地知道(或者至少知道结果的下限),则可以将容量传递给StringBuilder的构造函数。这样就不必分多个步骤增加阵列。例如,如果您知道输出至少为10000个字符,则可以将生成器初始化为10000个字符。

不要使用
。删除(0,sb.Length)
使用
.Clear()
。它更容易阅读,而且如果没有针对这个特殊用例优化Remove,
Clear
也会更快。
或者只分配一个新的StringBuilder。StringBuilder本身是轻量级的,因此我认为使用新的不会很昂贵。
我通常不会根据StringBuilder的性能优势来区分
Clear()
和分配一个新的StringBuilder,而是根据它来创建可读性更好的代码。这取决于您的用例。不要进行微优化,除非您的profiler已经证明这是必要的。
根据我的经验,您可以在某个方法的开头分配一个新的StringBuilder,并且在生成函数的返回值时只调用
ToString
。在这种情况下,仅仅为了重用StringBuilder而使函数接口复杂化是愚蠢的

我认为当您调用
ToString()
时,StringBuilder会给出它的内部缓冲区,因此内部缓冲区变得不可变,StringBuilder需要在下一次更改时分配一个新的缓冲区


如果您确切地知道(或者至少知道结果的下限),则可以将容量传递给StringBuilder的构造函数。这样就不必分多个步骤增加阵列。例如,如果您知道输出至少为10000个字符,则可以将生成器初始化为10000个字符。

好的,Clear优于Remove,但OP是否应该使用这两者?这主要取决于哪个生成的代码可读性更好。问题是没有.Clear()是SB。。。可能是因为一个很好的原因,所以我现在将使用一个新实例,谢谢ppl。它存在于.net 4中:“Clear是一个方便的方法,相当于将当前实例的Length属性设置为0(零)。”好,Clear比Remove好,但是OP是否应该使用这两种方法呢?这主要取决于哪种方法产生的代码可读性更好。。。可能是因为一个很好的原因,所以我现在将使用一个新实例,谢谢ppl。它存在于.net 4中:“Clear是一个方便的方法,相当于将当前实例的Length属性设置为0(零)。”特别是因为
Remove
可能无法识别(我没有查看源代码)您正在删除整个缓冲区,因此最终会出现一个未优化的代码路径,用于从字符串中间删除。当然,Remove更难阅读,我想这就是我需要的信息:)数据大小是一个完美的参考^ ^ ^ ^ ^感谢,特别是因为
Remove
可能无法识别(我没有查看源代码)您正在删除整个缓冲区,因此最终会出现一个未优化的代码路径,用于从字符串中间删除。当然,删除更难阅读,我想这是我需要的信息:)数据大小是一个完美的参考^ ^谢谢你会得到两个