1.正确操作字符串

(1)确保尽量少的装箱[会分配新的堆内存]

String str1 = "str1"+ 9; //装箱
String str2 = "str2"+ 9.ToString(); //ToString()直接操作内存,未装箱

在使用其他值引用类型到字符串的转换并完成拼接时,应当避免使用操作符“+”来完成,而应该使用值引用类型提供的ToString方法。

(2)避免分配额外的内存空间
对CLR来说,string对象(字符串对象)是个很特殊的对象,它一旦被赋值就不可改变。在运行时调用System.String 类中的任何方法或进行任何运算(如“=”赋值、“+”拼接等),都会在内存中创建一个新的字符串对象,这也意味着要为该新对象分配新的内存空间。

private static void NewMethod1() 
{ 
    string s1 = "abc"; 
    s1 = "123" + s1 + "456"; //以上两行代码创建了3个字符串对象,并执行了一次string.Contact方法 
} 

private static void NewMethod6() 
{ 
    string re6 = 9 + "456"; //该代码发生一次装箱,并调用一次string.Contact方法 
} 

而在以下代码中,字符串不会在运行时拼接字符串,而是会在编译时直接生成一个字符串:

private static void NewMethod2() 
{ 
    string re2 = "123" + "abc" + "456"; //该代码等效于 
    //string re2 = "123abc456"; 
} 

private static void NewMethod9() 
{ 
    const string a = "t"; 
    string re1 = "abc" + a; //因为a是一个常量,所以 
    /该行代码等效于 string re1 = "abc" + "t"; 
    /最终等效于string re1 = "abct"; 
} 

StringBuilder并不会重新创建一个string对象,它的效率源于预先以非托管的方式分配内存。如果StringBuilder 没有先定义长度,则默认分配的长度为16。当StringBuilder字符长度小于等于 16时,StringBuilder不会重新分配内存;当StringBuilder字符长度大于16小于32时,StringBuilder又会重新分配内存,使之成为16的倍数。当然,我们需要注意,StringBuilder指定的长度要合适,太小了,需要频繁分配内存;太大了,浪费空间。
微软还提供了另外一个方法来简化这种操作,即使用string.Format方法。string.Format方法在内部使用StringBuilder进行字符串的格式化。

private static void NewMethod11() 
{ 
    //为了演示的需要,定义了4个变量 
    string a = "t"; 
    string b = "e"; 
    string c = "s"; 
    string d = "t"; 
    string.Format("{0}{1}{2}{3}", a, b, c, d); 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值