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 時,在達到容量之前,它不會爲其自己重新分配空間。當達到容量時,將自動分配新的空間且容量翻倍。可以使用重載的構造函數之一來指定 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替換掉。如:


public string Replace(char oldChar,char newChar)
{
    string st = "abcdef";
    string newstring = st.Replace('a', 'x');
    Console.WriteLine(newstring);   //即:xbcdef
}

在對象中尋找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位置開始,刪除此位置後所有的字符(包括當前位置所指定的字符)。如:  

public string Remove(int startIndex)
{
    string st = "abcdef";
    string newstring = st.Remove(4);
    Console.WriteLine(newstring);  //即:abcd
}

從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位置開始,提取此位置後所有的字符(包括當前位置所指定的字符)。如:  

public string Substring(int startIndex)
{
    string st = "abcdef";
    string newstring = st.Substring(2);
    Console.WriteLine(newstring);  //即:cdef
}

從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 Trim (params char[] trimChars )
{
    string st ="abcdef";
    string newstring = st.Trim(new char[] {'a'});//尋找st字符串中開始與末尾是否有與'a'匹配,如有,將其移除。
    Console.WriteLine(newstring); //即:bcdef
}

注:如果字符串爲"aaaabcdef",返回依然爲bcdef。當移除第一個a時,開始依然爲a,繼續移除,直到沒有。
public string TrimEnd ( params char[] trimChars ):對此實例末尾與指定字符進行匹配,true則移除
public string TrimStart ( params char[] trimChars ):對此實例開始與指定字符進行匹配,true則移除
5.ToLower(轉換大小寫)
public string ToLower():將字符串對象包含的字符串中的大寫全部轉換爲小寫。
6.IndexOf(獲取指定的字符串的開始索引)
在此實例中尋找field,如果尋找到,返回開始索引,反之,返回-1。如:

public int IndexOf (sring field)
{
    string st = "abcdef";
    int num=st.IndexOf("bcd");
    Console.WriteLine(num);  
}

7.Equals(是否相等)
比較調用方法的字符串對象包含字符串和參數給出的對象是否相同,如相同,就返回true,反之,返回false。如:    

public bool Equals (string value)
{
    bool b = a.Equals("bcdef");
    Console.WriteLine(b);//即:false
    public bool Equals ( string value, StringComparison comparisonType ): 比
}

較調用方法的字符串對象包含字符串和參數給出的對象是否在不區分大小寫的情況下相同,如相同,就返回true,反之,返回false,第二個參數將指定 區域性、大小寫以及比較所用的排序規則.如:

string a = "ABCDEF";
bool b = a.Equals("abcdef",StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine(b);//即:true

8.Split(拆分)
根據separator 指定的沒有字符分隔此實例中子字符串成爲Unicode字符數組, separator可以是不包含分隔符的空數組或空引用。 如:

public string[] Split ( params char[] separator )
{
     string st = "語文|數學|英語|物理";
     string[] split = st.Split(new char[]{'|'},2);
     for (int i = 0; i < split.Length; i++)
     {
         Console.WriteLine(split[i]);
     }
}

public enum StringSplitOptions 
成員名稱            說明
None                返回值包括含有空字符串的數組元素
RemoveEmptyEntries  返回值不包括含有空字符串的數組元素。如:

string st = "語文|數學||英語|物理";
            string[] split = st.Split(new char[]{'|'},StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < split.Length; i++)
            {
                Console.WriteLine(split[i]);
            }

將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 ) :第二個參數設置比較時區域、大小寫和排序規則。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章