C#中可变字符串和不可变字符串有什么区别?

202

在C#中,可变字符串和不可变字符串有什么区别?


2
可能是重复的问题 - https://dev59.com/snE95IYBdhLWcg3wUMLW - RameshVel
6
不完全相同。非常相似,但这与完全相同是不一样的。 - Marcelo Cantos
2
有关StringBuilder内部的相关问题 https://dev59.com/EHA65IYBdhLWcg3w6DNO - Brian Rasmussen
15个回答

1

数据值可能无法更改。注意:变量值可以更改,但原始不可变数据值已被丢弃,并在内存中创建了一个新的数据值。


0

来自http://yassershaikh.com/what-is-the-difference-between-strings-and-stringbuilder-in-c-net/

简短回答:String是不可变的,而StringBuilder是可变的。

这是什么意思? 维基百科说:在面向对象编程中,不可变对象是指其状态在创建后无法修改的对象。这与可变对象形成对比,可变对象在创建后可以被修改。

从StringBuilder类文档中得知:

String对象是不可变的。每次使用System.String类中的方法时,都会在内存中创建一个新的字符串对象,这需要为该新对象分配新的空间。

在需要对字符串执行重复修改的情况下,创建新的String对象所需的开销可能很大。

当您想要修改字符串而不创建新对象时,可以使用System.Text.StringBuilder类。例如,在循环中连接许多字符串时,使用StringBuilder类可以提高性能。


-1

使用StringBuilder来连接大量数据字符串是更好的选择,因为StringBuilder是可变字符串类型,而StringBuilder对象是不可变类型,这意味着在连接字符串时,StringBuilder永远不会创建新的对象实例。

如果我们使用字符串而不是StringBuilder来实现连接,则每次都会在内存中创建新的实例。


-1

C# 中的字符串是不可变的。如果你将其与任何字符串连接起来,实际上是在创建一个新的字符串对象!但 StringBuilder 可以创建可变字符串。


-1

这里是不可变字符串和可变字符串构建器的示例

        Console.WriteLine("Mutable String Builder");
        Console.WriteLine("....................................");
        Console.WriteLine();
        StringBuilder sb = new StringBuilder("Very Good Morning");
        Console.WriteLine(sb.ToString());
        sb.Remove(0, 5);
        Console.WriteLine(sb.ToString());

        Console.WriteLine();

        Console.WriteLine("Immutable String");
        Console.WriteLine("....................................");
        Console.WriteLine();
        string s = "Very Good Morning";
        Console.WriteLine(s);
        s.Substring(0, 5);
        Console.WriteLine(s);
        Console.ReadLine();

如果您能提供输出,那就太好了,@Gokul :) - Roy Lee
子字符串不会更改底层值,它只返回一个值。 - Kye
@Kye 为什么?因为字符串是不可变的 :) - LuckyLikey
1
你的两行代码:s.Substring(0, 5); Console.WriteLine(s); 这里 s.substring() 不会改变 s。这个例子并没有展示字符串是否是不可变的。 - Dhananjay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接