国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

系統的方法就一定是最好的?

2019-11-14 16:37:46
字體:
來源:轉載
供稿:網友

引言

  今天又聽到有人說,這個類(這個方法)系統都有,直接用系統的就好了,難道你寫的還會比系統的好?

  我就疑問了:同樣是人寫的代碼,為什么系統的一定就是最好的?

廢話不多,直接上代碼

string.IsNullOrWhiteSpace(string value)

這個方法相信大家都非常的熟悉

但是當有一天我打開Reflector看到他的源碼的時候我就震驚了....

//string類public static bool IsNullOrWhiteSpace(string value){    if (value != null)    {        for (int i = 0; i < value.Length; i++)        {            if (!char.IsWhiteSpace(value[i]))            {                return false;            }        }    }    return true;}//char類public static bool IsWhiteSpace(char c){    if (IsLatin1(c))    {        return IsWhiteSpaceLatin1(c);    }    return CharUnicodeInfo.IsWhiteSpace(c);}PRivate static bool IsLatin1(char ch){    return (ch <= '/x00ff');} private static bool IsWhiteSpaceLatin1(char c){    if (((c != ' ') && ((c < '/t') || (c > '/r'))) && ((c != '/x00a0') && (c != '/x0085')))    {        return false;    }    return true;}//CharUnicodeInfo類internal static bool IsWhiteSpace(char c){    switch (GetUnicodeCategory(c))    {        case UnicodeCategory.SpaceSeparator:        case UnicodeCategory.LineSeparator:        case UnicodeCategory.ParagraphSeparator:            return true;    }    return false;}public static UnicodeCategory GetUnicodeCategory(char ch){    return InternalGetUnicodeCategory(ch);}internal static UnicodeCategory InternalGetUnicodeCategory(int ch){    return (UnicodeCategory) InternalGetCategoryValue(ch, 0);}internal static unsafe byte InternalGetCategoryValue(int ch, int offset){    ushort num = s_pCategoryLevel1Index[ch >> 8];    num = s_pCategoryLevel1Index[num + ((ch >> 4) & 15)];    byte* numPtr = (byte*) (s_pCategoryLevel1Index + num);    byte num2 = numPtr[ch & 15];    return s_pCategoriesValue[(num2 * 2) + offset];}

 一共有8個相關的方法,用到的字段就沒有往下深究了

至少就char.IsWhiteSpaceLatin1(char c)這一個方法最多的時候就需要判斷5次

如此簡單的一個方法為什么要這么復雜呢?

 

《C#中那些[舉手之勞]的性能優化》我的這篇文章最后一節就是說關于char類型的處理

這里有一種空間換時間的優化方式, 雖說是空間換時間,但是實際浪費的空間不會很多,因為char最多只有65536長度

利用這一點,我完全可以自己實現一個

/// <summary> 指示空白字符的數組/// </summary>private static bool[] _WhiteChars = InitWhiteChars();/// <summary> 初始化 _WhiteChars/// </summary>/// <returns></returns>private static bool[] InitWhiteChars(){    var arr = new bool[char.MaxValue];    for (int i = char.MinValue; i <= char.MaxValue; i++)    {        if (char.IsWhiteSpace((char)i)) //如果字符是空白字符        {            arr[i] = true;//將字符對應數組的值設置為true        }    }    return arr;}/// <summary> 指示指定的字符串是 null、空還是僅由空白字符組成。(比系統的破方法快)/// </summary>/// <param name="str">要測試的字符串。</param>/// <returns></returns>public static bool IsNullOrWhiteSpace(this string str){    if (str == null)    {        return true;    }    var length = str.Length;    if (str.Length == 0)    {        return true;    }    if (_WhiteChars[str[0]] == false)    {        return false;    }    for (int i = 1; i < length; i++)    {        if (_WhiteChars[str[i]] == false)        {            return false;        }    }    return true;}

是的 ,沒錯 ,就2個方法,其中一個還是靜態方法,全局只會執行一次

判斷的時候只有一個數組索引取值的操作,如果取出是true 就證明是空白字符...多么簡單的邏輯啊

系統方法我沒有太深入的研究..除非.. CharUnicodeInfo.InternalGetCategoryValue 方法在運行中有可能改變返回的結果,否則我的方法將和系統方法的返回值是一樣的

同理,再順便寫一個判斷char的

/// <summary> 指示指定的 Unicode 字符是否屬于空白類別。(比系統的破方法快)/// </summary>/// <param name="str">要計算的 Unicode 字符。</param>/// <returns></returns>public static bool IsWhiteSpace(this char value){    return _WhiteChars[value];}

 后話

  剛學.net的時候,那時csdn還非常火,依稀記得,當時在csdn論壇有各式各樣的攻擂貼,其中就有不少挑戰系統方法的

  http://bbs.csdn.net/topics/360117794  其中一篇攻擂貼

  也就是在那時,我知道了系統方法也終究只是人寫的,只要是人就一定存在人外人

  技術就是古代武學一樣(我經常把設計模式比作武功套路),所謂文無第一武無第二 ,說的就是武功的好壞一比就知道了,技術也是一樣

  多學習,多研究,多觀察,多測試. 真正把一個方法,一個類搞懂,你自然就知道他的好壞

  不要盲目的崇拜誰,只要是XXX就一定是最好的! 憑我N年的經驗,這樣是最好的! 都沒有說服力! 都是程序猿,咱們拿代碼說話

廣告

  更多C#技術交流,歡迎加群:5946699;暗號:C#交流

  歡迎喜歡C#,熱愛C#,正在學習C#,準備學習C#的朋友來這里互相學習交流,共同進步

  群主就是我,有問題可以在群里@我,我們一起討論研究


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黄陵县| 丰都县| 独山县| 清苑县| 淮安市| 古蔺县| 通城县| 林周县| 疏附县| 长海县| 开阳县| 上饶县| 永福县| 肃南| 包头市| 阳信县| 蓬安县| 河北省| 扎鲁特旗| 九江市| 循化| 铁力市| 兴化市| 怀仁县| 古浪县| 防城港市| 盐边县| 乌拉特中旗| 万州区| 通许县| 开江县| 大厂| 浑源县| 通辽市| 邹平县| 军事| 外汇| 安岳县| 新河县| 岳池县| 阳高县|