CLR via c#讀書筆記九:字符、字符串和文本處理
1、在.NET Framework中,字符總是表示成16位unicode代碼值(關於unicode、utf8等可以到http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html中查看)。
2、在字符編碼術語中,碼位或編碼位置,即英文的code point或code position,是組成碼空間(或代碼頁)的數值。例如,ASCII碼包含128個碼位。
3、System.String代表一個不可變的(immutable)順序字符集。String類型直接派生自Object,所以是引用類型。因此,String對象(它的字符數組)總是存在於堆上,永遠不會跑到線程棧。
4、編譯器允許在源代碼中直接使用字面值(literal)字符串。編譯器將這些字符串放到模塊的元數據中,並在運行時加載和引用它們。
5、所有字符串都要字面值,所以C#編譯器能在編譯時連接它們,最終只將一個字符串(即"Hi there.")放到模塊的元數據中。對非字面值字符串使用+操作符,連接則在運行時進行。運行時連接不要使用+操作符,因為這樣會在堆上創建多個字符串對象,而是需要垃圾回收的,對性能有影響。應該使用System.Text.StringBuilder類型。
String s="Hi"+" "+"there.";//在編譯時編譯連接它們,最終只將一個字符串放到模塊的元數據中。 String s="Hi"+a+b+"there."//在運行時連接,會在堆上創建多個字符串對象
6、String對象最重要的一點就是不可變(immutable)。所以對字符串使用方法操作也是創建新的字符串。例如:
if(s.ToUpperInvariant().Substring(10,21).EndWith("EXE")){ ... }
如果執行大量的字符沖操作,會在堆上創建大量String對象,造成更頻繁的垃圾回收,從而影響應用程序性能。
7、比較字符串強烈建議調用String類定義的方法之一:
Boolean Equals(string value,StringComparison comparisonType)
....(Page285)
8、強烈建議用ToUpperInvariant方法對字符串進行正規化,而不要使用ToLowerInvariant,因為Microsoft對執行大寫比較的代碼進行了優化。之所以不用ToUpper和ToLower方法,是因為它們對語言文化敏感。
9、傳遞StringComparison.Ordinal執行胡就是序號比較,也就是不考慮語言文化信息,只比較字符串胡每個char的unicode碼位。
10、String的其他比較方法CompareTo(IComparable接口所要求的)、CompareOrdinal以及==和!=操作符也應避免使用。之所以要避免使用這些方法和操作符,是因為調用者不顯式指出以什麽方式執行字符串比較,而你無法從方法名看出默認比較方式。
CLR via c#讀書筆記九:字符、字符串和文本處理