有時候我們需要對字符串進(jìn)行修改,但是.net里面的字符串是只讀的,修改動作會產(chǎn)生一個新的字符串,多數(shù)時候這都不是我想要的結(jié)果。不過fixed還是可以幫我們解決一部分問題的,比如.ToLower、.ToUpper、.Replace(char, char)等等,不過有個限制,就是變換前后的字符串長度不變。
public unsafe static string toLower(this string value) { if (value != null) { fixed (char* valueFixed = value) toLowerUnsafe(valueFixed, valueFixed + value.Length); } return value; } public unsafe static void toLower(char* start, char* end) { if (start != null && end > start) toLowerUnsafe(start, end); } public unsafe static void toLowerUnsafe(char* start, char* end) { while (start != end) { if ((uint)(*start - 'A') < 26) *start |= (char)0x20; ++start; } }
public unsafe static string toUpper(this string value) { if (value != null) { fixed (char* valueFixed = value) toUpperUnsafe(valueFixed, valueFixed + value.Length); } return value; } public unsafe static void toUpper(char* start, char* end) { if (start != null && end > start) toUpperUnsafe(start, end); } public unsafe static void toUpperUnsafe(char* start, char* end) { while (start != end) { if ((uint)(*start - 'a') < 26) *start -= (char)0x20; ++start; } }
public static string replace(this string value, char oldChar, char newChar) { return value != null && value.Length != 0 ? replaceUnsafe(value, oldChar, newChar) : null; } public unsafe static string replaceNotNull(this string value, char oldChar, char newChar) { return value.Length != 0 ? replaceUnsafe(value, oldChar, newChar) : value; } public unsafe static string replaceUnsafe(this string value, char oldChar, char newChar) { fixed (char* valueFixed = value) { char* start=valueFixed, end = valueFixed + value.Length; char endValue = *--end; *end = oldChar; do { while (*start != oldChar) ++start; *start = newChar; } while (start++ != end); if (endValue != oldChar) *end = endValue; } return value; }
Release實測,效果還不錯,英文大小寫轉(zhuǎn)換運行時間降到了.ToLower與.ToUpper的1/4以下,字符替換運行時間降到了.Replace(char, char)的1/5以下,同時給垃圾回收也減少了很多壓力。當(dāng)然.ToLower與.ToUpper還是比較強大的,它不僅僅只是英文轉(zhuǎn)換,但是我個人只處理過英文大小寫問題。
需要注意的是,這里是直接修改字符串的數(shù)據(jù),會影響到所有相關(guān)引用,如果對影響程度沒有把握,一般建議應(yīng)用在一次性的臨時變量上。這里只是舉幾個例子,具體其它可能的字符串修改應(yīng)用就需要你自己卻發(fā)掘了。