最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中如何正確的使用字符串String

 更新時(shí)間:2018年12月05日 11:03:52   作者:Fode  
這篇文章主要給大家介紹了關(guān)于在C#中如何正確的使用字符串String的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

C#中提供了比較全面的字符串處理方法,很多函數(shù)都進(jìn)行了封裝為我們的編程工作提供了很大的便利。System.String是最常用的字符串操作類,可以幫助開(kāi)發(fā)者完成絕大部分的字符串操作功能,使用方便。

字符串作為所有編程語(yǔ)言中使用最頻繁的一種基礎(chǔ)數(shù)據(jù)類型。如果使用不慎,將會(huì)造成不必要的內(nèi)存開(kāi)銷,為此而付出代價(jià)。

而要優(yōu)化此類型,從以下兩點(diǎn)入手:

1、盡量少的裝箱

2、避免分配額外的內(nèi)存空間

先從第一點(diǎn)裝箱的操作說(shuō)起,查看如下代碼:

 //發(fā)生裝箱的代碼
 String boxOperate = "test" + 4.5f;

其中間語(yǔ)言IL代碼為如下:

 IL_0000: nop
 IL_0001: ldstr "test"
 IL_0006: ldc.r4 4.5
 IL_000b: box [mscorlib]System.Single
 IL_0010: call string [mscorlib]System.String::Concat(object, object)
 IL_0015: stloc.0
 IL_0016: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
 IL_001b: pop
 IL_001c: ret

不難看出,上述代碼發(fā)生了裝箱的操作(IL代碼中的box).裝箱之所以會(huì)發(fā)生性能損耗,因?yàn)樗瓿扇缦氯齻€(gè)步驟:

1、首先,會(huì)為值類型在托管堆中分配內(nèi)存。除了值類型本身所分配的內(nèi)存外,內(nèi)存總量還要加上類型對(duì)象指針和同步塊索引所占用的內(nèi)存,

2、將值類型的值復(fù)制到新分配的堆內(nèi)存中。

3、返回已經(jīng)成為引用類型的對(duì)象的地址。

在來(lái)看以下代碼:

//沒(méi)有發(fā)生裝箱的代碼
 String boxOperate = "test" + 4.ToString();

其中間IL代碼如下:

 IL_0000: nop
 IL_0001: ldstr "test"
 IL_0006: ldc.r4 4
 IL_000b: stloc.1
 IL_000c: ldloca.s 1
 IL_000e: call instance string [mscorlib]System.Single::ToString()
 IL_0013: call string [mscorlib]System.String::Concat(string, string)
 IL_0018: stloc.0
 IL_0019: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
 IL_001e: pop
 IL_001f: ret

如上,并沒(méi)有發(fā)生任何裝箱操作,但是達(dá)到的結(jié)果卻是我們想要的。原因是 4.ToString() 這行代碼并沒(méi)有發(fā)生裝箱行為,是實(shí)際調(diào)用的是整數(shù)型的ToString()方法,其原型如下:

 public override string ToString(){
  return Number.FormatInt32(m_value, null, NumberFormat.CurrentInfo);
 }

可能有人會(huì)問(wèn),是不是原型中的 Number.Format_XXX方法會(huì)發(fā)生裝箱行為呢?實(shí)際上,Number.Format_XXX方法是一個(gè)非托管的方法,其原型如下:

[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
public statuc extern string FormatInt32(int value, string format,NumberFormatInfo info);

它是通過(guò)直接操作內(nèi)存來(lái)完成 Int32 到 String 的轉(zhuǎn)換,效率要比裝箱高得多。所以,在使用其他值引用類型到字符串得轉(zhuǎn)換比完成拼接時(shí),應(yīng)當(dāng)避免使用操作符 “+” 來(lái)我完成,而應(yīng)該使用值引用類型提供得ToString方法。

也許有人會(huì)問(wèn):即使FCL提供得方法沒(méi)有發(fā)生裝箱行為,但在其他情況下,F(xiàn)CL方法內(nèi)部會(huì)不會(huì)含有裝箱的行為?也許會(huì)存在,所以,本人推薦:編寫(xiě)代碼中,應(yīng)當(dāng)盡量避免發(fā)生不必要的裝箱代碼。

 

第二個(gè)方面:避免分配額外的空間。對(duì)于CLR來(lái)說(shuō),String對(duì)象(字符串對(duì)象)是個(gè)很特殊的對(duì)象,它一旦被賦值就不可改變(在內(nèi)存中)。在運(yùn)行時(shí)調(diào)用System.String類中的任何方法或進(jìn)行任何運(yùn)算('=‘賦值,'+‘拼接等),都會(huì)在內(nèi)存中創(chuàng)建一個(gè)新的字符串對(duì)象,這也意味著要為該新對(duì)象分配新的內(nèi)存空間。如以下代碼會(huì)帶來(lái)額外開(kāi)銷。

private static void Test(){
   String str1 = "aa";
  str1 = str1 + "123" + "345";
   //以上代碼創(chuàng)建了3個(gè)String對(duì)象,并執(zhí)行了一次String.Contact方法。
}

而在以下代碼中,字符串不會(huì)在運(yùn)行時(shí)拼接字符串,而是會(huì)在編譯時(shí)直接生成一個(gè)字符串。

private static void Test()
{
String str= "aa" + "123" + "345";//等效 String str= "aa123345";
}

private static void Test2()
{
const String str = "aa";
String newStr = "123" + str;
//因?yàn)閟tr是一個(gè)常量,所以該代碼等效于 String newStr = "123" + “aa”;
//最終等效于 String newStr = "123aa”;
}

由于使用System.String類會(huì)在某些場(chǎng)合帶來(lái)明顯的性能損耗,所以微軟另外提供了一個(gè)類型StringBuilder來(lái)彌補(bǔ)String的不足。

StringBuilder并不會(huì)重新創(chuàng)建一個(gè)String對(duì)象,它的效率源于預(yù)先以非托管的方式分配內(nèi)存。如果StringBuilder沒(méi)有先定義長(zhǎng)度,則默認(rèn)分配的長(zhǎng)度為16。當(dāng)StringBuilder的長(zhǎng)度大于16小于32時(shí),StringBuild又會(huì)重新分配內(nèi)存,使之成為16的倍數(shù)。StringBuilder重新分配內(nèi)存時(shí)按照上次的容量加倍進(jìn)行分配的。注意:StringBuilder指定的長(zhǎng)度要合適,太小了,需要頻繁分配內(nèi)存;太大了,浪費(fèi)內(nèi)存空間。

以下是例子舉例:

private static String Test3()
  {
   String a = "t";
   a += "e";
   a += "s";
   a += "t";
   return a;
  }
  private static String Test4()
  {
   String a = "t";
   String b = "e";
   String c = "s";
   String d = "t";
   return a + b + c + d;
  }
  //以上兩種效率都不高效。不要以為前者比后者創(chuàng)建的字符串對(duì)象更少,事實(shí)上,兩者創(chuàng)建的字符串對(duì)象相等
  //且前者進(jìn)行了3次的String.Contact方法調(diào)用,比后者還多了兩次。

要完成上圖的運(yùn)行時(shí)的字符串拼接(注意:是運(yùn)行時(shí)),更佳的做法是使用StringBuilder類型,代碼如下:

private static String Test5()
  {
   String a = "t";
   String b = "e";
   String c = "s";
   String d = "t";
   StringBuilder sb = new StringBuilder(a);
   sb.Append(b);
   sb.Append(c);
   sb.Append(d);
   return sb.ToString();
   //因?yàn)檎f(shuō)的是運(yùn)行時(shí),所以沒(méi)必要使用以下代碼
   //StringBuilder sb = new StringBuilder("t");
   //sb.Append("e");
   //sb.Append("s");
   //sb.Append("t");
   //return sb.ToString();
  }

微軟還提供了另外一個(gè)來(lái)簡(jiǎn)化這種操作,即使用String.Format 方法。String.Format方法在內(nèi)部使用StringBuilder 進(jìn)行字符串格式化,如下圖代碼:

private static String Test6()
{
  //為演示,定義4個(gè)變量
  String a = "t";
  String b = "e";
  String c = "s";
  String d = "t";
  return String.Format("{0}{1}{2}{3}", a, b, c, d);
}

總結(jié):

在使用String字符串時(shí),應(yīng)該盡量避免裝箱操作和“+”連接操作。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 詳解如何在C#中接受或拒絕Excel中的修訂

    詳解如何在C#中接受或拒絕Excel中的修訂

    修訂功能可以跟蹤文檔所有的修改,了解修改的過(guò)程,這對(duì)于團(tuán)隊(duì)協(xié)同文檔編輯、審閱是非常有用的一個(gè)功能。本文將詳細(xì)為您介紹如何接受或拒絕 Excel 中的修訂,感興趣的可以收藏一下
    2022-12-12
  • 詳解C#如何利用爬蟲(chóng)技術(shù)實(shí)現(xiàn)快捷租房

    詳解C#如何利用爬蟲(chóng)技術(shù)實(shí)現(xiàn)快捷租房

    做為一個(gè)碼農(nóng),大部分都集中在一二線城市,所以租房也就無(wú)可避免,面對(duì)如今五花八門(mén)的租房信息,往往很難找到合適的房子。本文教你如何利用爬蟲(chóng)技術(shù)實(shí)現(xiàn)快捷租房,感興趣的可以了解一下
    2022-09-09
  • C#?md5?算法實(shí)現(xiàn)代碼

    C#?md5?算法實(shí)現(xiàn)代碼

    相對(duì)C#來(lái)說(shuō),md5算法就相對(duì)簡(jiǎn)單很多,因?yàn)?System.Security.Cryptography;?已經(jīng)包含了md5算法。所以我們只需創(chuàng)建MD5類對(duì)象即可實(shí)現(xiàn)md5算法,今天通過(guò)本文給大家介紹C#?md5?算法實(shí)現(xiàn),感興趣的朋友一起看看吧
    2022-11-11
  • C#日期格式強(qiáng)制轉(zhuǎn)換方法(推薦)

    C#日期格式強(qiáng)制轉(zhuǎn)換方法(推薦)

    下面小編就為大家分享一C#日期格式強(qiáng)制轉(zhuǎn)換的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • C#中的ComboBox控件詳細(xì)使用方法

    C#中的ComboBox控件詳細(xì)使用方法

    這篇文章主要給大家介紹了關(guān)于C#中ComboBox控件詳細(xì)使用的相關(guān)資料,ComboBox控件是一個(gè)很容易使用出錯(cuò)的控件,在此將常用的操作寫(xiě)下來(lái),以備后用,需要的朋友可以參考下
    2023-09-09
  • Unity UGUI Button按鈕組件使用示例

    Unity UGUI Button按鈕組件使用示例

    這篇文章主要為大家介紹了Unity UGUI Button按鈕組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • C#中XML基礎(chǔ)用法

    C#中XML基礎(chǔ)用法

    可擴(kuò)展標(biāo)記語(yǔ)言,標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集,簡(jiǎn)稱XML。是一種用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語(yǔ)言。這篇文章介紹了C#中XML基礎(chǔ)的用法,下面的實(shí)例代碼,大家可以看看
    2021-12-12
  • C#獲取視頻某一幀的縮略圖的方法

    C#獲取視頻某一幀的縮略圖的方法

    這篇文章主要介紹了C#獲取視頻某一幀的縮略圖的方法,涉及執(zhí)行CMD命令及針對(duì)視頻文件操作的技巧,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-11-11
  • C# Winform中如何繪制動(dòng)畫(huà)示例詳解

    C# Winform中如何繪制動(dòng)畫(huà)示例詳解

    這篇文章主要給大家介紹了關(guān)于C# Winform中如何繪制動(dòng)畫(huà)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C# Winform具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Winform自定義控件在界面拖動(dòng)、滾動(dòng)鼠標(biāo)時(shí)閃爍的解決方法

    Winform自定義控件在界面拖動(dòng)、滾動(dòng)鼠標(biāo)時(shí)閃爍的解決方法

    這篇文章介紹了Winform自定義控件在界面拖動(dòng)、滾動(dòng)鼠標(biāo)時(shí)閃爍的解決方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評(píng)論

翼城县| 樟树市| 丹江口市| 蒲城县| 彭泽县| 蓬莱市| 崇文区| 株洲市| 怀宁县| 岳阳县| 临泽县| 长沙县| 通海县| 尤溪县| 罗江县| 塘沽区| 张家界市| 芦山县| 平昌县| 武宣县| 南宁市| 集贤县| 海城市| 松桃| 乌海市| 临西县| 南华县| 井陉县| 元氏县| 左贡县| 保康县| 清丰县| 东乡县| 弥渡县| 富阳市| 雅江县| 尚义县| 郧西县| 万山特区| 三原县| 鄢陵县|