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

引言

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

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

废话不多,直接上代码

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

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

系统的方法就一定是最好的?,布布扣,bubuko.com

时间: 2024-08-28 14:41:34

系统的方法就一定是最好的?的相关文章

【学习ios之路:Objective-C】OC中常用的系统排序方法

①.OC中常用排序方法: 1).不可变数组 - (NSArray *)sortedArrayUsingSelector:(SEL)comparator; - (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr; 2)可变数组 - (void)sortUsingSelector:(SEL)comparator; - (void)sortUsingComparator:(NSComparator)cmptr; 3).字典排序 - (NS

Hadoop之——重新格式化hdfs系统的方法

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46352939 重新格式化hdfs系统的方法: (1)查看hdfs-ste.xml: <property> <name>dfs.name.dir</name> <value>/home/hadoop/hdfs/name</value> <description>namenode上存储hdfs名字空间元数据</des

buntu下备份系统的方法

今天不小心强行结束了一不知道用处的进程,结果造成进不了x界面,gdm启动不了,使用apt-get进行修复,结果几乎要把整个x界面有关的软件包删除,所以只好重装系统,为了防止下次出现类似的问题,所以把系统做了一个备份. 备份的方法有两种,一种是通过一种软件进行被份,另外一种是通过命令行进行备份. 软件备份的方法是下载一个叫UCloner的软件.使用方法压缩包内已经说明了我就不再多说,不过因为这个软件说只支持Ubuntu 10.10 10.04 和9.10,所以别的版本就要使用命令行进行备份了. 下

富士通 安装双系统的方法

今天收到朋友的富士通UH554 笔记本,原装系统是Win8.1要求给他再装个XP系统(双系统),感觉没什么特别的一口答应下来,结果安装时半天进不了PE系统,傻了. 反复网上收索终于搞清楚了这个品牌的问题. 现贴出方法给大家以做参考: 2.压缩磁盘 在win8.1桌面,计算机(或者是"这台电脑")右键--管理--选择你的系统分区,右键--压缩卷,我选择安装XP,所以我只给了10个G的空间来安装XP,足够的,前提是不要安装太多不必要的软件在里面,稍等片刻,我们会看到系统磁盘后面有一个空白的

Android获取系统时间方法详解

Android获取系统时间方法的方法有很多种,常用的有Calendar.Date.currentTimeMills等方法. (1)Calendar Calendar获取系统时间首先要用Calendar.getInstance()函数获取一个实例,再为该实例设定时区(中国的时区为GMT+8:00),最后使用Calendar.get()函数获取时间的具体信息,如年,月,日,小时,分,秒,星期几. package com.hzhi.time_example; import java.util.Cale

如何在cocos2d-x中使用ECS(实体-组件-系统)架构方法开发一个游戏?

引言 在我的博客中,我曾经翻译了几篇关于ECS的文章.这些文章都是来自于Game Development网站.如果你对这个架构方式还不是很了解的话,欢迎阅读理解 组件-实体-系统和实现 组件-实体-系统. 我发现这个架构方式,是在浏览GameDev上的文章的时候了解到的.很久以前,就知道了有这么个架构方法,只是一直没有机会自己实践下.这一次,我就抽空,根据网上对ECS系统的讨论,采用了一种实现方法,来实现一个. 我很喜欢做游戏,所以同样的,还是用游戏实例来实践这个架构方法.我将会采用cocos2

仅使用U盘来加载Linux系统的方法

仅使用U盘来加载Linux系统的方法 也许你听过Linux并对它有点好奇,终于想要实际体验一下,但可能不知道从哪儿开始. 很可能你已经在网上搜索过一些信息,然后遇到一些像双系统和虚拟机这样的词汇.它们对你来说也许太专业了,所以你肯定不会仅仅为了尝试一下Linux而牺牲正在使用的操作系统.那我们该怎么办? 如果你手上正好有个U盘的话,那就可以试试做一个USB Linux启动盘.它是一个包含了整个操作系统并可以直接引导开机的U盘.创建它并不需要什么专业技术能力,让我们来看看怎么做,以及如何从USB引

tar备份系统的方法

下面是备份系统的方法: 然后打开终端,输入以下命令: 1.成为根用户:   sudo su 2.转到根目录:   cd / 然後,下面就是我用来备份我的系统的完整的命令:tar -cvpzf /media/sda7/backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys --exclude=/media / 接着,让我们稍微解释一下:     tar 是用来备份的程序     c - 新建一个备

win7系统备份方法

win7系统备份方法 最近本人在网上找到了一个非常简单的win7系统备份方法,出于我个人的热心肠,就迫不及待的想把这个win7系统备份方法分享给广大网友们,特别是那些对电脑不太懂的小白们,相信这个win7系统备份方法会很大程度上帮助到你们的.当然我也是一个电脑小白,虽然win7系统有自带备份操作但是太过意复杂或者操作起来也非常不方便.所以网上这个利用轻松备份专业版来进行win7系统备份的方法最终打动了我.下面我们就来看看操作步骤: 第一步:下载轻松备份专业版,安装并运行.打开软件来到主界面在"备