字符、字符串和文本的處理之String類型
.Net Framework中處理字符和字符串的主要有以下這麽幾個類:
(1)、System.Char類 一基礎字符串處理類
(2)、System.String類 一處理不可變的字符串(一經創建,字符串便不能以任何方式修改)
(3)、System.Text.StringBuilder類 一更高效地構建字符串
(4)、System.Secureity.SecureString類 一對字符串進行保護操作,它可以保護密碼和信用卡資料等敏感字符串.
一、String類型
1、簡介
在任何應用程序裏面,String類型都是用的最多的類型之一.一個String代表一個不可變的(immutable)的順序字符串,String類型直接派生自Object,所以它是應用類型.所以String對象(它的字符串數組)總是存在於堆上,永遠不會跑到線程棧.
C#將String視為基元類型,C#編譯器允許在源代碼中直接使用字面值字符串.編譯器將這些字符串存放到模塊的元數據中,並在運行時加載和引用它們.
C#不允許使用new操作符從字面值字符串構造String對象,代碼如下:
相反,必須使用以下簡化語法:
編譯代碼並檢查IL(使用ILDasm.exe),會看到以下內容:
用於構造對象新實例,但上述代碼中並沒有出現newobj指令,有一個特殊的ldstr(即 load string)指令,它使用從元數據獲得的字面值(literal)字符串構造String對象.這證明CLR實際是用一種特殊方式構造字面值String對象
如果使用不安全的(unsafe)代碼,可以從一個Char*或Sbyte*參數構造一個String.這時要使用C#的new操作符,並調用由String類型提供的、能接受Char*或Sbyte*參數的某個構造器.這些構造器將創建String對象,根據由Char實例或有符號(signed)字節構成的一個數組來初始化字符串。其他構造器則不允許接受任何指針參數,用任何托管編程語言寫的安全(可驗證)代碼都能調用它們.
2、關於特殊字符的處理:
C#提供了一些特殊的語法來幫助開發人員在源代碼中輸入字面值(literal)字符串,對於換行符、回車符和退格符這樣的特殊字符,C#采用的是C/C++開發人員熟悉的轉移機制,代碼如下:
//包含回車符和換行符的字符串 string s="Hi\r\nthere.";
3、關於字符串連接的問題
string s="Hi"+" "+"there .";
在上述代碼中,由於所有字符串都是字面值,所以C#編譯器能在編譯時連接它們,最終將一個字符串即(即"Hi there.")放到模塊的元數據中.對非字面值字符串使用+操作符,連接則在運行時進行.運行時連接不要用+操作符,因為這樣會在堆上創建多個字符串對象,而堆是需要垃圾回收的,對性能有影響.相反,應該使用StringBuilder類型.
4、字符串@轉義符
C#提供了一種特殊的字符串聲明方式.采取這種方式,印號之間的所有字符都會被視為字符串的一部分.這種特殊聲明稱為"逐字字符串",通常用於指定文件或目錄的路徑,或者與正則表達式配合使用。以下代碼展示了如何使用和不適用逐字字符串字符(@)來申明同一個字符串,代碼如下:
//指定應用程序路徑,使用\解析‘\‘ string file="C:\\Windows\\System32\\Notpad.exe"; //使用逐字字符串制定應用程序路徑 string file=@"C:\Windows\System32\Notepad.exe";
兩種寫法生成完全一樣的字符串,但後者的可讀性更好.
字符、字符串和文本的處理之String類型