本來說好的,有socket的記錄的,但是基礎(chǔ)知識還沒整理完,所以就先不寫,等基礎(chǔ)知識梳理完畢再進行記錄。
那么今天就先記錄一下關(guān)于string字符串類,還有就是StringBuilder類,它們倆的區(qū)別的聯(lián)系。
OK,那么我們開始進入正題。
首先,我來記錄一下,關(guān)于string類型的一些瑣碎知識:
- string類型是.NET Framework 中String的別名。
- string類型其實是一個數(shù)組,我們可以使用 [],來找到一個字符串中的某個字符,
比如:string str="abcdef"; str[1]就是b,注意str[1]是Char類型的字符。 - string類型是引用類型。
- 對于連接字符串,我們使用 + 號,比如 string a="as"; a=a+"df"; 這個時候a就是asdf;
- 對于string類型,關(guān)系運算符 “==”和“!=”,我們比較的是string定義的值,而不是其引用的值。比如:
static void Main(string[] args)
{
string a = "hello";
string b = "h";
b = b + "ello";
Console.WriteLine(a==b);
Console.WriteLine((Object)a == (Object)b);
Console.ReadKey();
}
這個時候輸出的就是True和False了。
- string類型有個重要的特性:就是不可變性,因為string是引用類型,我們定義一個string類型的時候,定義的值就是堆內(nèi)存中的某個存儲的值的地址,雖然我們可以改變string的值,
比如string a="string1",a="string2",a的值的確是變了,但是它此時在堆內(nèi)存中的額引用已經(jīng)變了,不是string1的引用,而是string2的引用,string1與string2指向的是不同的堆內(nèi)存位置,這就是string類型的不可變性。
這也是為什么我們會使用StringBuilder類的原因,因為當我們改變string類型定義的值的時候,相當于我們換了一塊堆內(nèi)存,然后原先的堆內(nèi)存就會等待著被GC回收掉,這無形中就消耗了性能。 - 字符串中可以有轉(zhuǎn)義字符,就是比如:\n這樣的換行符,但是,有時候我們需要用 \這個符號,怎么辦?
第一種方法:"\n" ,這個時候輸出的就是\n了。
第二中方法:@“\n”,這個時候輸出的也是\n。
還有要注意一下:若要在一個用 @ 引起來的字符串中包括一個雙引號,請使用兩對雙引號,
比如: string str = @"""Jom"",Hello!";這個時候輸出str,就是"Jom",Hello!,要用兩對雙引號將需要被雙引號括起來的字符串引起來。 - 空字符串與null是不一樣的,string a="";string b=null;
雖然輸出的時候,它們兩個都是表示空,但是空字符串,它也是一個字符,是一個string對象,相當于System.String.Empty。其Length的長度為0,而輸出b.Length的時候,就會報錯,null是空,什么字符也不表示。
暫時就想到了那么多,然后呢關(guān)于正則表達式,待會也會記錄一下。
下面記錄一下關(guān)于string類型的一些屬性方法。
字符串是String類型的對象,它的值是文本。在內(nèi)部,文本被存儲為Char對象的順序只讀集合。C# 字符串末尾沒有以 null 結(jié)尾的字符;因此 C# 字符串可以包含任意數(shù)目的嵌入式 null 字符(“\0”)。字符串的Length屬性代表了其所包含的Char字符的數(shù)量,而不是Unicode字符數(shù)量。
若要訪問字符串中的各個 Unicode 碼位,請使用 StringInfo 對象。
關(guān)于string類型的構(gòu)造函數(shù):

也就是說,我們可以使用new運算創(chuàng)建string對象,
比如:char[] array = {'a','b','c'};string a = new string(array);
但是,注意,除了在使用字符數(shù)組初始化字符串時以外,不要使用 new 運算符創(chuàng)建字符串對象。
下面記錄,一些關(guān)于string類型的靜態(tài)方法,這里只記錄一部分,像是什么重載之類的方法就不一一介紹了。
關(guān)于字符串比較:
public static int Compare(String strA, String strB);
當然,它還有一些方法重載,這里就不記錄了。
比較兩個字符串,如果strA“小于”strB 那么返回-1,如果strA“等于”strB 那么返回0,如果strA“大于”strB 那么返回1。
public static bool Equals(String a, String b);
如果 true 的值與 a 的值相同,則為 b;否則為 false。 如果 a 和 b 均為 null,此方法將返回 true。
關(guān)于字符串連接:
public static String Concat(String str0, String str1, String str2, String str3);
public static String Concat(String str0, String str1, String str2);
返回一個字符串,是方法參數(shù)按照順序連接在一起。
public static String Concat(params String[] values);
連接指定的string數(shù)組的元素,注意關(guān)鍵字 params 表示參數(shù)數(shù)組沒有固定的大小。
關(guān)于字符串Copy:
public static String Copy(String str);
創(chuàng)建一個與指定的 System.String 具有相同值的 System.String 的新實例。
關(guān)于檢索:
public static String Intern(String str);
檢索系統(tǒng)對指定 System.String 的引用。如果暫存了 str,則返回系統(tǒng)對其的引用;否則返回對值為 str 的字符串的新引用。
關(guān)于判斷null:
public static bool IsNullOrEmpty(String value);
指示指定的字符串是 null 還是 System.String.Empty 字符串。如何是空字符串或者null,那么返回true,否則返回false。
關(guān)于插入字符:
public static String Join(String separator, params object[] values);串聯(lián)對象數(shù)組的各個元素,其中在每個元素之間使用指定的分隔符。
關(guān)于格式化:
public static string Format(string str , Object obj);
將指定字符串中的一個或多個格式項替換為指定對象的字符串表示形式。
靜態(tài)方法就是那么多,然后就是一些實例方法了。
public object Clone();
返回對此string實例的引用。
public int CompareTo(string strB);
與strB進行比較,如果小于0,則比strB小,如果等于0,則與strB相等,如果大于0,則比strB大。
public bool Contains(string value);
如果value包含在該實例字符串中,則返回true,否則返回false。
public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count);
將指定數(shù)目的字符從此實例中的指定位置復制到 Unicode 字符數(shù)組中的指定位置。
第一個參數(shù): 要復制的此實例中第一個字符的索引。
第二個參數(shù):此實例中的字符所復制到的 Unicode 字符數(shù)組。
第三個參數(shù): destination 中的索引,在此處開始復制操作。
第四個參數(shù):此實例中要復制到 destination 的字符數(shù)。
public int IndexOf(String value, int startIndex, int count);
報告指定字符串在此實例中的第一個匹配項的從零開始的索引。 搜索從指定字符位置開始,并檢查指定數(shù)量的字符位置。如果找到該字符串,則為從當前實例的起始位置開始的從零開始的 value 的索引位置;否則為 -1。 如果 value 為 System.String.Empty,則返回值為startIndex。
public string Insert(int index , string value)
將value插入到指定的位置index。
public string Remove(int index);
返回當前實例中從指定位置到最后位置的所有以刪除的字符的新字符串。
public string Remove(int index , int count);
返回指定數(shù)量字符在當前這個實例起始點在已刪除的指定的位置的新字符串。
public string Replace(char oldChar , char newChar);
返回一個新字符串,其中此實例中出現(xiàn)的所有指定 Unicode 字符都替換為另一個指定的 Unicode 字符。
public string Replace(string oldStr , string newStr);
返回一個新字符串,其中當前實例中出現(xiàn)的所有指定字符串都替換為另一個指定的字符串。######public String[] Split(char[] separator, int count);
基于數(shù)組中的字符將一個字符串拆分成最大數(shù)量的子字符串。 也可指定要返回的子字符串的最大數(shù)量。注意返回的是數(shù)組。
public String Substring(int startIndex);
從此實例檢索子字符串。 子字符串在指定的字符位置開始并一直到該字符串的末尾。
public String Substring(int startIndex, int length);
從此實例檢索子字符串。 子字符串從指定的字符位置開始且具有指定的長度。
public String ToLower();
返回此字符串轉(zhuǎn)換為小寫形式的副本。
public String ToUpper();
返回此字符串轉(zhuǎn)換為大寫形式的副本。
比較常用和重要的就是這些了。
下面講一下關(guān)于StringBuilder的知識點。
首先,StringBuilder的功能其實和string類型很像,可是為什么會有兩個功能相近的東西出現(xiàn)呢?這不是很腦殘的事件么?
還記得string的最重要的一個特性吧,那就是不變性?。?!
由于string類型的不變性,如果我們反復修改字符串,那么就可能會造成性能上的損失,這個時候,我們可是使用StringBuilder類型。
StringBuilder類型是一個可變字符串類,可變性意味著,一旦創(chuàng)建類的實例后,可以修改通過追加、 刪除、 替換或插入字符。
一個 StringBuilder 對象會維護一個緩沖區(qū)來容納擴展到字符串。
如果沒有可用空間,將新數(shù)據(jù)追加到緩沖區(qū)否則為系統(tǒng)會分配新的、 更大的緩沖區(qū)、 從原始緩沖區(qū)的數(shù)據(jù)復制到新的緩沖區(qū)和新的數(shù)據(jù)則追加到新的緩沖區(qū)。
比如,我們在創(chuàng)建一個StringBuilder類型的實例的時候給它20大小的空間,如果20不夠,那么它就會自動的增加到40,也就是2倍,但是不會創(chuàng)建新的實例,也就沒有了頻繁GC,所以性能損耗就會減少。
但是,StringBuilder并非萬能的,當遇到如下情況的時候,可以使用string類型:
- 當對字符串的更改并不頻繁時。
- 當正在執(zhí)行固定的數(shù)量的串聯(lián)運算,特別是對于字符串文字時。
- 當需要對字符串執(zhí)行廣泛的搜索操作時,因為StringBuilder缺少如IndexOf這樣的方法。
當你遇到如下情況時,可以考慮使用StringBuilder:
- 當你對字符串進行的更改無法預知時。
- 當你想對字符串進行大量的更改時。
OK,下面就在記錄一些關(guān)于StringBuilder類型的屬性和方法:
傳送門:https://msdn.microsoft.com/zh-cn/library/system.text.stringbuilder.aspx
關(guān)于StringBuilder的方法:
public StringBuilder Append(string str);//它有很多的重載方法。
向?qū)嵗芳又付ǖ淖址?/p>
public StringBuilder Append(string value , int startIndex , int count);
向此實例追加指定子字符串的副本。
public StringBuilder AppendFormat(string format , object arg);
向此實例追加通過處理復合格式字符串(包含零個或更多格式項)而返回的字符串。 每個格式項都替換為一個參數(shù)的字符串表示形式。
public StringBuilder AppendLine(string value);
將后面跟有默認行終止符的指定字符串的副本追加到當前 System.Text.StringBuilder 對象的末尾。
public StringBuilder AppendLine();
將默認的行終止符追加到當前 System.Text.StringBuilder 對象的末尾。
public StringBuilder Clear();
從當前 System.Text.StringBuilder 實例中移除所有字符。
public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count);
將此實例的指定段中的字符復制到目標 System.Char 數(shù)組的指定段中。
public StringBuilder Insert(int index, string value, int count);
將指定字符串的一個或更多副本插入到此實例中的指定字符位置。
public StringBuilder Insert(int index, string value);
將字符串插入到此實例中的指定字符位置。
public StringBuilder Remove(int startIndex, int length);
將指定范圍的字符從此實例中移除。
public StringBuilder Replace(string oldValue, string newValue);
將此實例中出現(xiàn)的所有指定字符串的替換為其他指定字符串。
OK,最后再給一個StringBuilder的例子,就此完結(jié)。
using System;
using System.Text;
public class Example
{
public static void Main()
{
// Create a StringBuilder object with no text.
StringBuilder sb = new StringBuilder();
// Append some text.
sb.Append('*', 10).Append(" Adding Text to a StringBuilder Object ").Append('*', 10);
sb.AppendLine("\n");
sb.AppendLine("Some code points and their corresponding characters:");
// Append some formatted text.
for (int ctr = 50; ctr <= 60; ctr++) {
sb.AppendFormat("{0,12:X4} {1,12}", ctr, Convert.ToChar(ctr));
sb.AppendLine();
}
// Find the end of the introduction to the column.
int pos = sb.ToString().IndexOf("characters:") + 11 +
Environment.NewLine.Length;
// Insert a column header.
sb.Insert(pos, String.Format("{2}{0,12:X4} {1,12}{2}", "Code Unit",
"Character", "\n"));
// Convert the StringBuilder to a string and display it.
Console.WriteLine(sb.ToString());
}
}