为什么没有其他不可变类型的StringBuilder等效?

时间:2012-01-13 10:51:08

标签: c# .net vb.net

StringBuilder的存在纯粹是因为.NET中的字符串是不可变的,即传统的字符串连接可以使用大量资源(由于创建了大量的String对象)。

所以,因为Int32也是不可变的为什么不存在多个类的类,例如?

4 个答案:

答案 0 :(得分:8)

有。 UriBuilder用于构建Uri个对象。

Int32Builder会做什么?通过使用这样的类,对单个整数进行哪些有意义的操作会更方便和/或更高效?

要使XXXBuilder类有意义,必须遵守以下规则:

  1. 类或结构是不可变的。
  2. 通过将值替换为基于之前的值(例如someString += "abc"someDate = someDate.AddDays(1))来更改值必须相对昂贵(在前一个示例中比后者更真实)和/或相对错综复杂代码。
  3. 对这样一个XXXBuilder类的要求是很常见的,提供它是有意义的,而不是让那些需要它的人自己编码。
  4. 以上都不适用于int。它们适用于stringUri。我不认为参考与值类型特别相关,除了第2点适合的情况也将是一个类几乎肯定是比值类型更好的设计选择的情况。

    实际上,第1点和第2点的组合在.NET中相对不常见。有些人会认为不太常见(那些喜欢大量使用不可变类型的人)。如果我们可以避免第2点,那么我们会,不是吗?没有人会想“我会把它编码为昂贵和笨拙并提供建造者类”。相反,他们有时会认为“我深思熟虑的不可变性的缺点是,虽然它给了我很多优势,但它使一些操作变得昂贵和笨拙,所以我也会提供一个建造者课程。”

答案 1 :(得分:7)

串联字符串变长,需要堆内存分配和内存副本 字符串获得的时间越长越贵,我们有一个帮助类(即StringBuilder)来最小化字符串连接时的复制量。

Int不是连续的,因为你需要多次使用你不需要更多的内存来保存两个乘法整数的结果,你只需要另一个int(如果是*=则需要相同的int)。

如果您需要连接整数到某种形式的列表,您只需要一个辅助类。 。 。哦等等,List<int>

答案 2 :(得分:4)

Int32类型。

String参考类型。 StringBuilder存在,因为 String是一种不可变的引用类型。 String也是Char集合 - 当您连接字符串时会发生很多分配 - StringBuilder事先进行这些分配,从而更有效地创建连接字符串。这不是值类型的问题。

答案 3 :(得分:0)

因为Int32是一个值类型,通常在堆栈上(或在堆对象的主体内)分配。例如,在循环中添加许多值类型时,编译器将自动重用内存位置。

答案基本上是“因为实施细节,这意味着没有必要”。

字符串连接速度慢,导致需要StringBuilder这一事实本身就是一个实现细节。

值类型可以跟踪它们的生命周期,因为它们具有值类型语义。是否发生这是一个实现细节。在实践中它确实如此,这就是为什么不需要IntBuilder类的原因。