一. 正確操作字符串
字符串是引用類型
·
1.確保盡量少的裝箱操作化戳,多使用ToString方法
string str1 = "str1" + 9;
string str1 = "str1" + 9.ToString;
第一行代碼生成的IL代碼如圖
第二行代碼生成的IL代碼如圖
可以看出单料,第一行代碼運行時會完成一次裝箱行為(IL代碼中的box),第二行代碼沒有裝箱
·
2. 避免分配額外的內(nèi)存空間
string對象一旦賦值就不可改變点楼。運行時調(diào)用System.String類中的任何方法或進行任何運行(=+)扫尖,都會在內(nèi)存中創(chuàng)建一個新的字符串對象,分配新的內(nèi)存空間掠廓。下面就是錯誤的示例
private static void NewMethod1()
{
string s1 = "abc";
s1 = "123" + s1 + "456"; //創(chuàng)建了三個字符串對象换怖,并執(zhí)行了一次 string.Contact方法
}
private static void NewMethod2()
{
string re6 = 9 + "456"; //發(fā)送一次裝箱,并執(zhí)行了一次 string.Contact方法
}
·
3.使用StringBuilder代替string產(chǎn)生的性能損耗
private static void NewMethod3()
{
StringBuilder builder = new StringBuilder("t");
builder.Append("e");
string result = builder.ToString();
}
還有一個方法可以簡化這種操作却盘,即使用string.Format方法狰域,這個方法內(nèi)部使用了StringBuilder進行字符串格式化
private static void NewMethod3()
{
string a = "t";
string b = "e";
string.Format("{0}{1}",a,b);
}
·
二. 使用默認轉(zhuǎn)型方法
類型轉(zhuǎn)換 ,是我們經(jīng)常會用到的
·
1.使用類型的轉(zhuǎn)換運算符
轉(zhuǎn)換運算符:隱式轉(zhuǎn)換和顯示轉(zhuǎn)換(強制轉(zhuǎn)換)黄橘,基元類型?大多數(shù)都有轉(zhuǎn)換運算符
int i = 0 ;
float j = 0;
j = i; //int到float類型存在一個隱式轉(zhuǎn)換
i = (int)j; //float到int存在兆览,而且必須存在一個顯示轉(zhuǎn)換
2.使用類型內(nèi)置的Parse、TryParse塞关、ToString等方法
在FCL?中抬探,如果某個類型經(jīng)常需要進行轉(zhuǎn)型操作,類型自身則會帶有 一些轉(zhuǎn)型方法 帆赢。比如從string轉(zhuǎn)型為int小压,因為其經(jīng)常發(fā)生,所以int本身就提供了Parse和TryParse方法
3.使用幫助類提供的方法
可以使用如 System.Convert類椰于、System.BitConverter類來進行類型的轉(zhuǎn)換
4.使用CLR支持的轉(zhuǎn)型
額外知識補充
1怠益、裝箱為什么會帶來性能損耗
- 首先,會為值類型在托管堆中分配內(nèi)存瘾婿。除了值類型本身所分配的內(nèi)存外蜻牢,內(nèi)存總量還要加上類型對象指針和同步塊索引所占用的內(nèi)存
- 將值類型的值復(fù)制到新分配的堆內(nèi)存中
- 返回已經(jīng)成為引用類型的對象的地址
參考文獻
《編寫高質(zhì)量代碼改善c#程序的157建議》
? 基元類型:sbyte / byte / short / ushort /int / uint / long / ulong / char / float / double / bool
? FCL : (Framework Class Library)即Framework類庫。