话不多说直接开始。

String和StringBuilder的异同

相同点在于String和StringBuilder表示的都是连续序列的字符串,只是他们的内部实现方式有所不同。

不同点在于String是不可变类型,String值的每一次改变都是在创建新的对象。举例:

string s = "I am";
s = "I am Sky";

我们知道String在C#中是引用类型,第一行String类型的变量s首先是指向了内存中“I am”所在的内存空间。第二行当s被重新赋值为“I am Sky”时则是将s指向了“I am Sky”所在的内存空间。这两个是不同内存空间。所以当“I am”不在被引用的时候内存空间就会被回收,也是因为有GC的产生所以频繁的String修改对性能会有影响。看下面的图可能更容易理解一些。

unity转换为string函数 unity string_内存空间

这里在补充一下,举例:

string a = "I am Sky";
string b = "I am Sky";

像这样变量a和变量b都赋值为“I am Sky”,这里相当于a和b指向的是同一块内存空间。如图:

unity转换为string函数 unity string_内存空间_02

接下来我们讨论StringBuilder,StringBuilder是可变字符串,其内部维护的是一块在创建时就分配好的内存空间,只有当原有的内存空间不够时才会重新分配更大的内存空间。例如:

StringBuilder sb = new StringBuilder(256);
sb.Append("hello world");

为变量sb分配了一块256字节的内存空间,并往里面添加了“hello world”。只有当内存空间大小不够256的时候才会重新分配更大的空间。

 

如何选择String和StringBuilder

选择String:

  • 当我们对字符串修改的次数较少的时候可以使用String,在这种情况下StringBuilder对性能的提升可以忽略不计。
  • 在需要使用如 IndexOf 这样的搜索方法的时候可以使用String,在StringBuilder下并不存在这样的搜索方法,并且StringBuilder也不能进行继承自己添加方法。

选择StringBuilder:

  • 在使用循环来进行字符串操作的时候可以使用StringBuilder。
  • 当我们大量频繁修改字符串的时候可以使用StringBuilder。

 

有关更多StringBuilder的内容大家可以查看官方文档,下面是StringBuilder的官方文档连接。

https://docs.microsoft.com/zh-cn/dotnet/api/system.text.stringbuilder?view=netframework-4.7.2#StringAndSB