引用类型是在垃圾回收托管堆上分配的的对象。默认情况下,当我们对引用类型进行相等操作时(C# ==和!= 操作符),如果引用类型指向内存中的相同对象,则返回true。然而,尽管string数据类型确实是引用类型,但是相等性操作被重定义为比较字符串对象的值,而不是内存中它们引用对象。
string s2="my string";
s2="new string";
如图上图所示,当我们重新为s2赋值时底层并不是直接操作s2,而是为它创建一个新值得副本,再将这个新副本赋值给s2 。
所以,如果string被滥用,就会导致低效,并导致代码膨胀,特别是进行字符拼接操作时。如果需要表示在应用程序中用到的基本字符数据,使用string是个很好的选择。但是如果要构建使用大量文本的应用,使用string就会产生大量不必要的字符串副本。这样如果应用需要使用大量文本该怎么办?这是需要选择System.Text.StringBulider类,StringBuilder类与string类有很多相似的方法和属性,但是不同的是StringBuilder类的一些方法可以操作其本身,而不是新建副本。
string的不可变性:
string s = "a";
s.Insert(0, "b");
System.Console.WriteLine("s:"+s);
string s2 = s.Insert(0, "b");
System.Console.WriteLine("s:" + s);
System.Console.WriteLine("s2:"+s2);
输出结果:
从上面代码中可以看出,string的Insert方法并不对变量s进行操作,而是将处理之后的字符串作为一个返回值。所以s本身的值不变。