标签:正确 StringBuilder 001 Concat new 字符串 sb Append string
-
避免不必要的装箱
struct MyStruct { }
public static String Concat(params object[] args);
string str1 = "str1" + 9 + false + new MyStruct() + new object();
等价于
string str1 = string.Concat("str1", 9, false, new MyStruct(), new object());
以上,发生3次装箱,1次Concat
改为
string str1 = "str1" + 9.ToString() + false.ToString() + new MyStruct().ToString() + new object();
未发生装箱,性能较高
结论:
拼接字符串时(+ 或 Concat),以 + 值类型.ToString()方式,不要以 + 值类型方式
-
避免分配额外的内存空间
拼接"abc"和"123"的三种方法
const string cs123 = "123"; string s123 = "123"; string str = "abc" + "123"; // 方法1 str = "abc" + s123; // 方法2 str = "abc" + cs123; // 方法3
方法1因为都是字面值,所以编译时相当于
string str = "abc123"
,未调用Concat(),未分配内存空间方法2调用1次Concat(),分配1次内存空间
方法3等价于方法1,因为cs123是constant字面值,在编译期就被替换成“123”。未调用Concat(),未分配内存空间
-
使用StringBuilder拼接字符串
string是不可变类型,任何修改字符串的操作都会导致开辟新的内存空间,频繁修改字符串或拼接字符串时,使用StringBuilder更合适。
a. StringBuilder功能表现就像是一个List
b. 非托管方式分配内存
c. 默认容量16,但可以指定初始容量,不够用时就翻倍
拓展
装箱为什么影响性能?
引入了内存开销 + 时间开销
步骤:
a. 开辟堆中内存:值本身 + 类型对象指针 + 同步索引块
b. 栈中值复制到堆
c. 实例地址返回到栈中引用变量
9.ToString()
结构体调用它的方法时并不需要先装箱。微软为int提供的ToString()实际调用的是非委托代码直接操作内存返回一个字符串,而非通过CLR.
String.Format()
String.Format("{0}{1}{2}{3}",a,b,c,d);
$"{a}{b}{c}{d}"
$插值法和String.Format()底层都是使用StringBuilder拼接
测试题
StringBuilder sb = new StringBuilder();
sb.Append("t");
sb.Append("e");
sb.Append("s");
sb.Append("t");
烂代码。使用StringBuilder拼接字面值多此一举,采用"t" + "e" + "s" + "t"形式拼接,编译时直接是"test",内存和时间开销最佳。
string a = "t";
string b = "e";
string c = "s";
string d = "t";
StringBuilder sb = new StringBuilder();
sb.Append(a);
sb.Append(b);
sb.Append(c);
sb.Append(d);
好代码。StringBuilder适合拼接运行时字符串变量。
标签:正确,StringBuilder,001,Concat,new,字符串,sb,Append,string 来源: https://www.cnblogs.com/LiuwayLi/p/15176894.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。