標籤:style io ar color os 使用 sp on 資料
- 系統處理文本的方式
【新知識點】.NET Framework
.NET Framework的定義:其包含了一個通用語言執行平台(Common Language Runtime),和一個類庫
其中有幾個概念:
CLI通用語言基礎結構(Common Language Interface):CLI定義了可執行代碼和運行環境的規範。
運行環境:虛擬運行系統(Virtual Execution System,VES)。
CTS一般型別系統(Common Type System):CTS是CLI的核心。
C# 語言編譯後的MSIL其實是CLR指令集。
託管堆:
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()也是不區分文化的比較。網上說是非安全的比較,所以速度最快。
C# 字串知識整理