C#--字符串操作
我們在實際的開發過程中,對字符串的操作是經常遇到的,其中涉及到字符串拼接、拆分、比較、替換等操作。C#提供了string類型,String和StringBuilder兩種類來對字符串進行處理。那么string,String,StringBuilder對字符串進行處理有何異同,在實際編程中,對于不同的字符串操作應該采用哪種方式來提高程序的效率呢?下面先來分析一下string,String,StringBuilder,最后再總結一下在編程過程中常用的字符串。
string:
string,msdn給出的解釋就是:string 是C#中的關鍵字,并且是引用類型, string 類型表示零或更多 Unicode 字符組成的序列。string 是 .NET Framework 中 String 的別名。C#中定義相等運算符(== 和 !=)是為了比較 string 對象(而不是引用)的值。
String:
String是類,表示文本,即一系列 Unicode 字符。String 對象是不可改變的。每次使用 System.String 類中的方法之一時,都要在內存中創建一個新的字符串對象,這就需要為該新對象分配新的空間。如:當我們實例化一個String的對象后,在內存中為此對象分配一個空間。如下:String str = “hello”;當我們修改str的值的時候,如:str = “hello world”;此時,系統會為str重新分配一個空間。這樣原來的內存空間就被浪費掉了,只能等待垃圾回收器回收。在需要對字符串執行重復修改的情況下,與創建新的 String對象相關的系統開銷可能會非常昂貴。
string與String的區別:
string 是 .NET Framework 中 String 的別名,string是C#基元類型(primitive),簡單來說就是編譯器直接支持的數據類型。基元類型要直接映射到Framework類庫(FCL)中的類型。例如,C#中一個基元類型int直接映射到System.Int32類型,這里int是基元類型,System.Int32是FCL類型。而String是FCL類型的,所以在C#的編譯時,會自動的把string轉化為System.String。所以string與String實質上沒什么區別,只是在使用string時要做一次轉換,轉換為String。因此,在編碼時更推薦使用String。
StringBuilder:
出于性能方面的考慮,大量的串聯或所涉及其他字符串操作應通過StringBuilder類來執行。StringBuilder表示可變字符字符串, 它允許我們有效的對字符串的字符執行動態操作,有效的縮減字符串的大小或者更改字符串中的字符。如果字符串變大,超過已經分配的字符的大小,StringBuilder就會自動的分配一個全新的、更大的數組,并開始使用新的數組,雖然 StringBuilder 對象是動態對象,允許擴充它所封裝的字符串中字符的數量,但是您可以為它可容納的最大字符數指定一個值。此值稱為該對象的容量,不應將它與當前 StringBuilder 對象容納的字符串長度混淆在一起。例如,可以創建 StringBuilder 類的帶有字符串“Hello”(長度為 5)的一個新實例,同時可以指定該對象的最大容量為 25。當修改 StringBuilder 時,在達到容量之前,它不會為其自己重新分配空間。當達到容量時,將自動分配新的空間且容量翻倍??梢允褂弥剌d的構造函數之一來指定 StringBuilder 類的容量。
String 或 StringBuilder 對象的串聯操作的性能取決于內存分配的發生頻率。String 串聯操作每次都分配內存,而 StringBuilder 串聯操作僅當 StringBuilder 對象緩沖區太小而無法容納新數據時才分配內存。因此,如果串聯固定數量的 String 對象,則 String 類更適合串聯操作。這種情況下,編譯器甚至會將各個串聯操作組合到一個操作中。如果串聯任意數量的字符串,則 StringBuilder 對象更適合串聯操作;例如,某個循環對用戶輸入的任意數量的字符串進行串聯。
C#中判斷空字符串
明確null和string.Empty的區別:string.Empty:不分配存儲空間。" ":分配一個長度為空的存儲空間 ," "和String.Empty,這兩個都是表示空字符串,空字符串是一個特殊的字符串,只不過這個字符串的值為空,在內存中是有準確指向的。string.Empty就相當于" ",一般用于字符串的初始化。比如: string a = string.Empty;在進行為空的比較時。string.Empty和" "是一樣的。即如果string test1 = " ";則可以使用if(test1==" ") 或者if(test1==string.Empty) 進行判斷。上面兩句是一樣的效果。
Null:null 關鍵字是表示不引用任何對象的空引用的文字值。null 是引用類型變量的默認值,那么也只有引用型的變量可以為NULL,如果 int i=null的話,是不可以的,因為Int是值類型的。
String.Empty和Null,這兩個都是表示空字符串,string str1= String.Empty,這樣定義后,str1是一個空字符串,空字符串是一個特殊的字符串,只不過這個字符串的值為空,在內存中是有準確的指向的 ,string str2=null,這樣定義后,只是定義了一個string 類的引用,str2并沒有指向任何地方,在使用前如果不實例化的話,都將報錯。
Str1=“ ”時,在內存里不分配空間,也沒有對象。
Str2=null時,在內存里分配空間,有一個字符串對象。
C#中常用的字符串操作
1.Replace(替換字符):
在對象中尋找oldChar,如果尋找到,就用newChar將oldChar替換掉。如:
在對象中尋找oldString,如果尋找到,就用newString將oldString替換掉。如:
public?string?Replace(string?oldString,string?newString) {string?st?=?"abcdef";string?newstring?=?st.Replace("abc",?"xyz");Console.WriteLine(newstring);???//即:xyzdef }2.Remove(刪除字符):
從startIndex位置開始,刪除此位置后所有的字符(包括當前位置所指定的字符)。如:??
從startIndex位置開始,刪除count個字符。如:??
public?string?Remove(int?startIndex,int?count) {string?st?=?"abcdef";string?newstring?=?st.Remove(4,1);Console.WriteLine(newstring);??//即:abcdf }3.Substring(字符串提取):
從startIndex位置開始,提取此位置后所有的字符(包括當前位置所指定的字符)。如:??
從startIndex位置開始,提取count個字符。如:??
public?string?Substring(int?startIndex,int?count){string?st?=?"abcdef";string?newstring?=?st.Substring(2,2);Console.WriteLine(newstring);??//即:cd }4.Trim(清空空格):
public?string?Trim?():將字符串對象包含的字符串兩邊的空格去掉后返回。
public?string?TrimEnd?(?params?char[]?trimChars?):對此實例末尾與指定字符進行匹配,true則移除。
public?string?TrimStart?(?params?char[]?trimChars?):對此實例開始與指定字符進行匹配,true則移除。
5.ToLower(轉換大小寫)
public?string?ToLower():將字符串對象包含的字符串中的大寫全部轉換為小寫。
public?string?ToUpper():將字符串對象包含的字符串中的大寫全部轉換為大寫。
6.IndexOf(獲取指定的字符串的開始索引)
在此實例中尋找field,如果尋找到,返回開始索引,反之,返回-1。如:
7.Equals(是否相等)
比較調用方法的字符串對象包含字符串和參數給出的對象是否相同,如相同,就返回true,反之,返回false。如:????
較調用方法的字符串對象包含字符串和參數給出的對象是否在不區分大小寫的情況下相同,如相同,就返回true,反之,返回false,第二個參數將指定 區域性、大小寫以及比較所用的排序規則.如:
string?a?=?"ABCDEF"; bool?b?=?a.Equals("abcdef",StringComparison.CurrentCultureIgnoreCase); Console.WriteLine(b);//即:true8.Split(拆分)
根據separator?指定的沒有字符分隔此實例中子字符串成為Unicode字符數組,?separator可以是不包含分隔符的空數組或空引用。?如:
public?enum?StringSplitOptions?
成員名稱????????????說明
None????????????????返回值包括含有空字符串的數組元素
RemoveEmptyEntries??返回值不包括含有空字符串的數組元素。如:
將StringSplitOptions枚舉和Split()方法聯系起來:
1.??public?string[]?Split?(?char[]?separator,?StringSplitOptions?options?):options 指定StringSplitOptions枚舉的RemoveEmptyEntries以省略返回的數組中的空數組元素,或指定 StringSplitOptions枚舉的None以包含返回的數組中的空數組元
2.??public?string[]?Split?(?char[]?separator,?int?count,?StringSplitOptions?options?)?
3.??public?string[]?Split?(?string[]?separator,?StringSplitOptions?options?)?
4.??public?string[]?Split?(?string[]?separator,?int?count,?StringSplitOptions?options?)
9.Contains(判斷是否存在)
public?bool?Contains(string?text):如果字符串中出現text,則返回true,反之false,如果text為("")也返回true。如:
?string?st="語文數學英語";
?bool?b=st.Contains("語文");
?Console.WriteLine(b);//true
10.EndsWith,StartsWith(判斷字符串的開始或結束)
public?bool?EndsWith?(?string?value?):判斷對象包含字符串是否以value指定的字符串結束,是則為?true;否則為?false。?
public?bool?EndsWith?(?string?value,?StringComparison?comparisonType?):第二個參數設置比較時區域、大小寫和排序規則。
public?bool?StartsWith?(?string?value?):判斷對象包含字符串是否以value指定的字符串開始,是則為?true;否則為?false。?
public?bool?StartsWith?(?string?value,?StringComparison?comparisonType?)?:第二個參數設置比較時區域、大小寫和排序規則。
總結
- 上一篇: 当yum 遇到No more mirro
- 下一篇: C#--数组和集合