字串zzC#

來源:互聯網
上載者:User
字串
       字串在C#中是System.String(或簡化作小寫string)類的一個執行個體,它表示一個不變的字元序列。字串的建立的文法很簡單:string s = "C# Sharp XP";即在託管堆上建立了內容為字串"C# Sharp XP"的記憶體地區,而s僅僅是指向該記憶體地區的一個引用控制代碼。看下面的程式碼:
string s1="Hello,World!";
string s2=s1;
       這時,s1和s2都指向同一塊含"Hello,World!"的記憶體區。
C#為字串提供了兩種轉義表達。第一種和傳統C/C++中的逸出字元表達相同,即用反斜線”\”加特定字元的表達方式。如”\t”表示Tab鍵,”\r”表示斷行符號,”\n”表示換行等等。我們要表示C盤“我的文件”下的一個檔案路徑,string MyPath=”C:\\Documents and Settings\\Cornfield\\My Documents\\MyFile.cs”,其中雙斜線被轉義為單斜線。而採用第二種表示方法,我們可以在字串前加一個“@”符號即可按正常的字元序列來表達字串,如上面的檔案路徑可以象這樣來表達:string MyPath=@”C:\Documents and Settings\Cornfield\My Documents\MyFile.cs”,和前面的表達效果相同。第二種表示方法在我們表達包含特殊字元的長字串的情況下非常有用,它甚至能夠表達不能夠顯示為字元形式的斷行符號,換行等特殊字元。
可以通過索引器來擷取字串中的單個字元(16位Unicode編碼)——這和C/C++中的字串數組在本質上是完全不同的。下面的代碼示範了這一點:
string s = "C# Sharp XP";
for (int index = 0; index < s.Length; index++)
    Console.WriteLine(s[index]);
       由於字串恒定性的緣故,我們不能做類似s[index]=’p’的改變,這是由System.String的唯讀索引器public char this[int index] {get;}來保證的。
       作為System.String類型的執行個體,系統為字串提供了豐富多樣的操作,這裡只對幾個比較特殊的方法做一剖析。String類實現了ICloneable介面,但String.Clone方法並不是返回一個新建立的String執行個體,而是僅僅返回一個和參數一樣的引用控制代碼,也就是說string s2=s1.Clone()和前面的string s2=s1效果一樣。需要返回一個和參數內容一樣,但引用控制代碼不同的字串可以採用靜態String.Copy方法。執行個體方法System.Equal,和類操作符public static bool operator ==(string a,string b);比較的都是兩個字串的內容是否相等,而非引用控制代碼。下面的程式碼範例,集中展示了上述方法的行為:
using System;
class Test
{
    public static void Main()
    {
        string s1 = "Hello,World!";
        string s2= s1.Clone().ToString();//複製,控制代碼相等,內容相等
        string s3 = string.Copy(s1); // 拷貝,控制代碼不等,內容相等
        
        Console.WriteLine(s1==s2);//True,內容相等
      Console.WriteLine(s1==s3);//True,內容相等
        
        Console.WriteLine((object)s1==(object)s2);//True,控制代碼引用相等
        Console.WriteLine((object)s1==(object)s3);//False,控制代碼引用不等
    }
}

字串恒定性
字串的恒定的意思是指一旦字串的值(System.String執行個體)被建立後,它便不可以改變.我們看下面一個典型的程式碼:
string s1="Hello,";
string s2="World!";
s1+=s2;
       上面的語句執行完後,s1=”Hello,World!”,s2=”World!”。但s1原來的值”Hello,”並沒有因此消失,確切地講”Hello,”仍然佔有記憶體空間,只不過現在不能被我們引用到而已,它只能等待.NET的自動垃圾收集器來回收其資源,這在以前的C++中就造成了記憶體流失.也就是說在上面的語句執行後,我們將擁有”Hello,World!”(s1引用控制代碼的指向的值),”World!”(s2引用控制代碼指向的值),”Hello,”(沒有引用控制代碼指向該值)共三個儲存字串的記憶體區.
       字串值恒定的特徵還表現在作為string類型的參數傳遞上,我們看下面的例子:
using System;
class Test
{
    public static void Main()
    {
        string p="Hello,";
         MyMethod(p);
        Console.WriteLine(p);//輸出Hello,
    }
    public static void MyMethod(string p)
    {
        p+="World!";
        Console.WriteLine(p);//輸出Hello,World!
    }
}
       雖然我們說string類型在C#中是一種參考型別,但由於字串的恒定的性質,我們的方法MyMethod並沒有改變傳進來的p的引用控制代碼(若要改變則需要採用ref關鍵字修飾參數),而這個引用控制代碼本身指向的表達字串"Hello,"的記憶體地區也沒有改變,自然通過MyMethod方法的調用字串p也就不會改變。
理解字串值恒定的特徵對我們在C#中熟練操作字串非常重要,比如System.String類的很多的方法實際上並沒有改變參與操作的字串本身,而是建立一個新值,僅僅把原來的字串丟給自動垃圾收集器。如果C#程式中頻繁地操作字串,很有可能引起字串大量的“建立/丟棄”動作,勢必給系統造成負擔,這時我們應該藉助於StringBuilder類。StringBuilder位於System.Text命名空間下,它的執行個體不是字串,但它為可變字串提供了豐富的操作——插入,追加,替換,刪除等,同時由於它的操作發生在同一塊記憶體區,因此沒有恒定字串System.String頻繁的“建立/丟棄”的消耗。可以非常方便地利用構造器public StringBuilder(string value);來建立含有value字串值的StringBuilder類執行個體,同樣可以用StringBuilder的執行個體方法ToString非常方便地得到類型為string的他的字串內容。和System.String類的很多方法相反,StringBuilder類的很多方法改變的正是參與操作的StringBuilder類執行個體本身,並不建立新值!
作為一個一般性的原則,我們如果僅僅涉及到字串的內容表示,或者建立新的字串,我們往往採用System.String的方法就可以了。但如果要涉及到大量的字串內容的變更操作時,就很有必要採用StringBuilder類的一些相關方法,然後再調用ToString方法得到我們需要的字串。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.