1. 程式人生 > >CLR via c#讀書筆記九:字符、字符串和文本處理

CLR via c#讀書筆記九:字符、字符串和文本處理

頻繁 方法名 ros obj utf8 via title col point

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#讀書筆記九:字符、字符串和文本處理