zoukankan      html  css  js  c++  java
  • 系统的方法就一定是最好的?

    引言

      今天又听到有人说,这个类(这个方法)系统都有,直接用系统的就好了,难道你写的还会比系统的好?

      我就疑问了:同样是人写的代码,为什么系统的一定就是最好的?

    废话不多,直接上代码

    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 < '	') || (c > '
    '))) && ((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#的朋友来这里互相学习交流,共同进步

      群主就是我,有问题可以在群里@我,我们一起讨论研究

  • 相关阅读:
    shell脚本判断语句和循环语句
    shell脚本基础
    Linux防火墙(Firewalls)
    RAID磁盘阵列
    LVM逻辑卷创建管理
    vue与django结合使用
    Python使用pyecharts绘制cpu使用量折线图
    Centos8 网络配置静态IP
    Html表格处理
    django的教程相关
  • 原文地址:https://www.cnblogs.com/blqw/p/3794043.html
Copyright © 2011-2022 走看看