14.1 字元 三種數值類型與 Char 實例的相互轉換: 14.2 System.String類型 14.2.1 構造字元串 14.2.2 字元串是不可變的 14.2.3 比較字元串 出於編程的目的而比較字元串時,應該總是使用 StringComparison.Ordinal 或者 StringC ...
14.1 字元
三種數值類型與 Char 實例的相互轉換:
static void Main()
{
Char c;
Int32 n;
//方法一: 通過C#轉型(強制類型轉換)實現數字與字元的相互轉換
//效率最高
c = (char)65;
Console.WriteLine(c); //顯示"A"
n = (int)c;
Console.WriteLine(n); //顯示"65"
c = unchecked((char)(65536 + 65));
Console.WriteLine(c); //顯示"A"
//方法二: 使用Convert實現數字與字元的相互轉換
c = Convert.ToChar(65);
Console.WriteLine(c); //顯示"A"
n = Convert.ToInt32(c);
Console.WriteLine(n); //顯示"65"
//演示Convert的範圍檢查
try
{
c = Convert.ToChar(70000); //對16位來說過大
Console.WriteLine(c); //不執行
}
catch (OverflowException)
{
Console.WriteLine("Can't convert 70000 to a Char.");
}
//方法三: 使用IConvertible實現數字與字元的相互轉換
//效率最差.因為在值類型上調用介面方法要求對實例進行裝箱--Char 和所有數值類型都是值類型.
c = ((IConvertible)65).ToChar(null);
Console.WriteLine(c); //顯示"A"
n = ((IConvertible)c).ToInt32(null);
Console.WriteLine(n); //顯示"65"
}
14.2 System.String類型
14.2.1 構造字元串
14.2.2 字元串是不可變的
14.2.3 比較字元串
- 出於編程的目的而比較字元串時,應該總是使用 StringComparison.Ordinal 或者 StringComparison.OrdinalIgnoreCase . 忽略語言文化是字元串比較最快的方式.
- 如果要以語言文化正確的方式來比較字元串(通常為了向用戶顯示),就應該使用 StringComparison.CurrentCulture 或者 CurrentCultureIgnoreCase .
- 要在序號比較(傳遞 StringComparison.Ordinal 執行的就是序號比較,不考慮語言文化信息,只比較字元串中的每個Char的Unicode碼位)前更改字元串中字元的大小寫,應該使用 String 的 ToUpperInvariant 或 ToLowerInvariant 方法(String類沒有提供ToUpperOrdinal和ToLowerOrdinal方法).強烈建議用ToUpperInvariant方法對字元串進行正規化,因為Microsoft對執行大寫比較的代碼進行了優化.ToUpper和ToLower方法對語言文化敏感,速度較慢.
- 避免使用不帶 StringComparison 參數的其它重載方法,以及避免使用==和!=操作符,因為這樣無法從方法名看出預設比較方式,不利於代碼的閱讀和維護.
14.2.4 字元串留用
public static string Intern(string str);
public static string IsInterned(string str);
- Intern 獲取一個String,如果內部哈希表中存在,則返回該字元串的引用;如果不存在,就創建字元串的副本,並添加到內部哈希表中,返回對該副本的引用.
- IsInterned 和 Intern 類似,只是當內部哈希表中不存在時,不會創建,而是返回 null
- 瞭解就好,經測試,c#預設都是留用的.
14.2.5 字元串池
14.2.6 檢查字元串中的字元和文本元素
14.2.7 其他字元串操作
14.3 高效率構造字元串
14.3.1 構造 StringBuilder 對象
- StringBuilder 維護的字元數組長度預設為16,追加字元時,超出會倍增
- 數組動態擴容會損害性能,最好給一個合適的初始值. (這個類似於List的實現)
14.3.2 StringBuilder 的成員
14.4 獲取對象的字元串表示:ToString
14.4.1 指定具體的格式和語言文化
- "C" 表示貨幣格式
- "D" 表示十進位格式
- "E" 表示科學記數法(指數)格式
- "G" 表示常規格式
- "N" 表示數字格式
- "P" 表示百分比格式
- "X" 表示十六進位格式
var n = 123456;
Console.WriteLine(n.ToString("C"));
Console.WriteLine(n.ToString("D"));
Console.WriteLine(n.ToString("E"));
Console.WriteLine(n.ToString("G"));
Console.WriteLine(n.ToString("N"));
Console.WriteLine(n.ToString("P"));
Console.WriteLine(n.ToString("X"));
// 以下為輸出
// ¥123,456.00
// 123456
// 1.234560E+005
// 123456
// 123,456.00
// 12,345,600.00%
// 1E240
使用特定語言文化格式化:
decimal price = 123.54M; string s = price.ToString("C", new CultureInfo("en-US")); Console.WriteLine(s); //輸出: $123.54
14.4.2 將多個對象格式化成一個字元串
string s = string.Format("訂單 {0} 的商品數量為 {1:N0} 個,金額為 {2:C}",
"11", 1234, 10000);
Console.WriteLine(s);
//中文環境下輸出: 訂單 11 的商品數量為 1,234 個,金額為 ¥10,000.00
14.4.3 提供定製格式化器
14.5 解析字元串來獲取對象: Parse
- 如果頻繁調用 Parse, 而且 Parse 頻繁拋出異常,應用程式的性能會顯著下降. 可考慮 TryParse
14.6 編碼: 字元和位元組的相互轉換
//準備編碼的字元串
string s = "Hi there.";
//獲取從Encoding派生的一個對象.
//它知道怎樣使用UTF8來進行編碼/解碼
Encoding encodingUTF8 = Encoding.UTF8;
//將字元串編碼成位元組數組
Byte[] encodedBytes = encodingUTF8.GetBytes(s);
//顯示編好碼的位元組值
Console.WriteLine("Encoded bytes: " +
BitConverter.ToString(encodedBytes));
//將位元組數組解碼回字元串
String decodedString = encodingUTF8.GetString(encodedBytes);
//顯示解碼的字元串
Console.WriteLine("Decoded String: " + decodedString);
//上述代碼輸出如下:
// Encoded bytes: 48-69-20-74-68-65-72-65-2E
// Decoded String: Hi there.
- 避免使用 Encoding.Default ,不同伺服器有可能不同. (可在"控制面板" --> "區域和語言" --> "非 Unicode 程式中所使用的當前語言" 中設置)
14.6.1 字元和位元組流的編碼和解碼
14.6.2 Base-64字元串編碼和解碼
//獲取一組10個隨機生成的位元組
byte[] bytes = new byte[10];
new Random().NextBytes(bytes);
//顯示位元組
Console.WriteLine(BitConverter.ToString(bytes));
//將位元組解碼成 Base-64 位元組串,並顯示字元串
string s = Convert.ToBase64String(bytes);
Console.WriteLine(s);
//將Base-64字元串編碼回位元組,並顯示位元組
bytes = Convert.FromBase64String(s);
Console.WriteLine(BitConverter.ToString(bytes));
//範例輸出,因為是隨機數,所以結果會不同
// 35-17-02-B7-F2-AF-EC-2A-E7-5D
// NRcCt/Kv7CrnXQ==
// 35-17-02-B7-F2-AF-EC-2A-E7-5D