String 为什么';字符串生成器不是无处不在吗?

String 为什么';字符串生成器不是无处不在吗?,string,language-agnostic,String,Language Agnostic,我有点理解字符串生成器类的动机,但是所有语言都有一个吗?应该吗?我特别想到了PHP、Perl、Python和Ruby。我知道C#和Java。如果其他人没有,为什么不呢?他们不存在同样的实施问题吗?或者他们不在乎?并非所有语言都有字符串生成器 C、 例如,甚至没有字符串 在C++中,STD::string是可变的——它们可以被改变,因此对于单独的字符串生成器类没有真正的需要。 在C#(以及.NET的其他部分)中,字符串是不可变的-它们不能更改,只能替换。这导致了需要StringBuilder的问题

我有点理解字符串生成器类的动机,但是所有语言都有一个吗?应该吗?我特别想到了PHP、Perl、Python和Ruby。我知道C#和Java。如果其他人没有,为什么不呢?他们不存在同样的实施问题吗?或者他们不在乎?

并非所有语言都有字符串生成器

C、 例如,甚至没有字符串

在C++中,STD::string是可变的——它们可以被改变,因此对于单独的字符串生成器类没有真正的需要。

在C#(以及.NET的其他部分)中,字符串是不可变的-它们不能更改,只能替换。这导致了需要StringBuilder的问题


从技术上讲,.NET字符串是假装为值类型的引用类型。这样做是为了使它们的行为更像本机类型(int、float、decimal)。

当存在字符串流时,字符串生成器中不需要使用类似文件的对象来构造字符串

例如,Python有
StringIO

from cStringIO import StringIO
sio = StringIO()
sio.write("Hello")
sio.write(" world!!")
sio.write(111)
sio.write('!')
print sio.getvalue()

Hello world!!111!

Ruby也有自己的StringIO。在C++中,等价的是“代码> STD::StrasFix.< /P> java的字符串相同的事务是不可变的,因此级联操作实际上涉及在每个操作中创建新的、越来越大的对象。可以说字符串的可变性决定了字符串生成器模式的必要性吗?Python的字符串是不可变的,但它不需要类似的StringBuilder。当您编写a=a+'foo'时,它会创建一个新的字符串选项,其中包含一个+'foo',free()将a的旧内容释放,并修改a以指向新对象。@JustSomeGuy:C#也支持这一点,但为了减少临时字符串的数量(必须由GC收集)。NET还提供了一个StringBuilder类,它不会为每次修改创建一个新实例。@Brian:我猜Python的等价物类似于创建一个值列表,然后将它们连接在一起:print'。连接(值列表),这与字符串生成器有什么显著区别?@James Curran~重点是(我想)它与stringbuilder相同,但名称不同。。。