C# 字符串知識整理

  新知識點,只是對於本人來講而已。  數據庫

  1. 系統處理文本的方式

新知識點】.NET Framework數組

.NET Framework的定義:其包含了一個公共語言運行時(Common Language Runtime),和一個類庫緩存

其中有幾個概念:安全

CLI公共語言基礎結構(Common Language Interface):CLI定義了可執行代碼和運行環境的規範。性能

運行環境:虛擬運行系統(Virtual Execution System,VES)。優化

CTS通用類型系統(Common Type System):CTS是CLI的核心。ui

C# 語言編譯後的MSIL實際上是CLR指令集。編碼

託管堆:spa

CLR爲應用程序預留了一塊內存,此內存塊就是託管堆,應用類型都存儲在堆中。代理

 

新知識點】Char類型的結構是Unicode字符,其中每一個Unicode字符佔2個字節(未使用代理對,代理對是有兩對2個字節組成)。

 

新知識點】值類型和應用類型的區別:值類型包括整型、枚舉、字符和結構。引用類型包括類、接口、數組和字符串。對於值類型,編譯器在編譯的時候已經知道了其數據類型佔的內存大小,因此把它分配到一個虛擬的棧中。對於引用類型,只有在運行該代碼的時候才知道該類型佔多大的內存,因此他須要動態分配,在託管堆中分配,在聲明一個引用類型變量是,同時給它賦值了一個引用後,如要該變該變量的值,例如:Apple A= New Apple(); A=New Apple();

這裏依次給A賦值了兩次,其中,兩個New Apple()是產生了兩個新的引用。這就是處理字符串時候,string類型的性能限制所在。

新知識點】在C#中char是有兩個字節組成的,跟short的大小同樣,是Unicode字符。string類型在存儲中實質是char數組,因此string也是Unicode的。在內存中,通常在存儲過程當中,在第一位存string變量的長度,或者在最後一位新增一個0x00,標識字符串結束。

一些系統爲了給字符串分配最小的內存空間,纔有高速緩存模式,Microsoft纔有BSTR(Binary String)二進制字符串。較長的字符串鏈接時,在堆分配時間時耗時比較長,這意味着,先鏈接長度較短的字符串能更好的利用性能。

新知識點】內置:CLR會自動維護一個「內置池」。內置池的做用,當程序用一樣的字符串初始化string變量的時候,CLR只會引用內置池的一個實例。不會在內存中從新分配一個地址。這有利於節省內存,要知道通常string類型的變量都是很大的。內置池是經過散列表實現的,檢索內置池的時候是利用散列碼,因此速度會很快。運行時建立的字符串,是不會自動內置的。咱們可使用String.Intern(s1),來檢查字符串是不是內置的。

         2.String類和StringBuilder類

新知識點】在給一個string類賦新值或者鏈接的時候,性能損耗主要在兩個地方:

  內存的從新分配【引用類型】

  字符串的複製

主要解決辦法:減小字符串引用生成的時候,分配從新空間次數,因此在初始化的時候,預先分配更多的內存空間。【因此會存在內存的浪費】,這是BuilderString類的工做原理。

新知識點】StringBuilder類有兩個屬性,一個是Length屬性,一個是Capacity屬性。Length是表示當前StringBuilder中字符串的長度,其不但能夠設定,也能夠獲取。Capacity屬性是表示當前StringBuilder中的容量大小。該容量會隨字符串的變化而增大的。

 

字符串優化操做技巧】推薦以下的操做技巧

  儘可能把字符串設置爲常量,這樣保證使用到內置池,同時最小化所需機器指令的數量。

  若是String類可以有效的工做,就不要使用StringBuilder類。

  若是要循環創建一個龐大的字符數據庫,就使用StringBuilder。

  若是須要國際化字符串,那麼只能使用Compare()。否者使用CompareOrdinal()方法。

  若是自誇知道字符串是否相同,那麼就應該使用Equals(),而不是CompareOrdianl()方法。

  一般狀況下使用方法Equals,而不是「=」運算符。

 

         3. 國際化

新知識點】Unicode:在不一樣的國家或者地區中,不一樣的計算機中,使用不一樣的字符集,致使同一個字符有不同的值。這增長了不一樣電腦之間數據轉換的複雜度。爲了解決這個問題,Unicode協會爲世界上每一個書面字符指定了一個位置值。一開始的時候,Unicode編碼是有兩個字節組成的,能表示65000多個字符,可是不能表示所有的字符。後來發明了一種代理對的東西,使用兩對兩字節的內存來表示一個字符。

新知識點】字符中的文化,在全世界中,表示同一種東西有不少不一樣的符號,例如表示100000元的時候,中國和美國就有以下兩種表示方法,系統是根據你本身的PC上設定的字符集來知道其表示形式的。其中有關的一個類就是CultureInfo類。 

新知識點】文化的分類:

  不變文化:是一種徹底不去文化的文化,不少系統進程須要獨立於文化,就是說,該文化下的字符與文化無關。

  中立文化:該文化與語言有關,與地區無關。

  具體文化:該文化與語言和國家地區相關。中立文化和具體文化的主要區別在於後者提供了具體地區或者國家的相關日期、時間、貨幣、和數字格式選項的附加信息。

 

新知識點】文化在程序中的應用:

  CurrentUICulture的值決定了如何加載一個窗體資源。能夠是中立文化。

  CurrentCulture的值決定了其餘方面—日期格式、數字格式、字符串大小寫和比較等等。必須是具體文化。

int money = 100000;

Console.WriteLine(money.ToString("C"));

 Thread.CurrentThread.CurrentCulture=new CultureInfo("en-US");  //具體文化

     Console.WriteLine(money.ToString("C"));

 

新知識點】文化與比較

在字符串比較中,能夠區分文化和不區分文化。若是不區分文化,那麼就按照Unicode碼來比較,若是區分文化,那麼就按照當前的文化來比較。

對於

string a = "ciao";

    string b = "character";

不區分文化的話,明顯是a>b。

 

string a = "ciao";

    string b = "character";

    if (string.Compare(a, b,true, new CultureInfo("cs-CZ")) < 0)

Console.Write("b>a");

若是當前文化是捷克語的話,那麼b>a。

  String.CompareOrdinal()是不區分文化的比較。

  String.Compare()是區分文化的比較。

  String.Equals()也是不區分文化的比較。網上說是非安全的比較,因此速度最快。

相關文章
相關標籤/搜索