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

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

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

废话不多,直接上代码string.IsNullOrWhiteSpace(stringvalue)

这个方法相信大家都非常的熟悉

但是当有一天我打开Reflector看到他的源码的时候我就震惊了....

//string类publicstaticboolIsNullOrWhiteSpace(stringvalue)

{if(value !=null)

{for(inti =0; i < value.Length; i++)

{if(!char.IsWhiteSpace(value[i]))

{returnfalse;

}

}

}returntrue;

}//char类publicstaticboolIsWhiteSpace(charc)

{if(IsLatin1(c))

{returnIsWhiteSpaceLatin1(c);

}returnCharUnicodeInfo.IsWhiteSpace(c);

}PRivatestaticboolIsLatin1(charch)

{return(ch <='\x00ff');

}privatestaticboolIsWhiteSpaceLatin1(charc)

{if(((c !='') && ((c <'\t') || (c >'\r'))) && ((c !='\x00a0') && (c !='\x0085')))

{returnfalse;

}returntrue;

}//CharUnicodeInfo类internalstaticboolIsWhiteSpace(charc)

{switch(GetUnicodeCategory(c))

{caseUnicodeCategory.SpaceSeparator:caseUnicodeCategory.LineSeparator:caseUnicodeCategory.ParagraphSeparator:returntrue;

}returnfalse;

}publicstaticUnicodeCategoryGetUnicodeCategory(charch)

{returnInternalGetUnicodeCategory(ch);

}internalstaticUnicodeCategoryInternalGetUnicodeCategory(intch)

{return(UnicodeCategory) InternalGetCategoryValue(ch,0);

}internalstaticunsafebyteInternalGetCategoryValue(intch,intoffset)

{ushortnum = s_pCategoryLevel1Index[ch >>8];

num= s_pCategoryLevel1Index[num + ((ch >>4) &15)];byte* numPtr = (byte*) (s_pCategoryLevel1Index +num);bytenum2 = numPtr[ch &15];returns_pCategoriesValue[(num2 *2) +offset];

}

一共有8个相关的方法,用到的字段就没有往下深究了

至少就char.IsWhiteSpaceLatin1(char c)这一个方法最多的时候就需要判断5次

如此简单的一个方法为什么要这么复杂呢?

《C#中那些[举手之劳]的性能优化》我的这篇文章最后一节就是说关于char类型的处理

这里有一种空间换时间的优化方式, 虽说是空间换时间,但是实际浪费的空间不会很多,因为char最多只有65536长度

利用这一点,我完全可以自己实现一个

///<summary>指示空白字符的数组///</summary>privatestaticbool[] _WhiteChars =InitWhiteChars();///<summary>初始化 _WhiteChars///</summary>///<returns></returns>privatestaticbool[] InitWhiteChars()

{vararr =newbool[char.MaxValue];for(inti =char.MinValue; i <=char.MaxValue; i++)

{if(char.IsWhiteSpace((char)i))//如果字符是空白字符{

arr[i]=true;//将字符对应数组的值设置为true}

}returnarr;

}///<summary>指示指定的字符串是 null、空还是仅由空白字符组成。(比系统的破方法快)///</summary>///<param name="str">要测试的字符串。</param>///<returns></returns>publicstaticboolIsNullOrWhiteSpace(thisstringstr)

{if(str ==null)

{returntrue;

}varlength =str.Length;if(str.Length ==0)

{returntrue;

}if(_WhiteChars[str[0]] ==false)

{returnfalse;

}for(inti =1; i < length; i++)

{if(_WhiteChars[str[i]] ==false)

{returnfalse;

}

}returntrue;

}

是的 ,没错 ,就2个方法,其中一个还是静态方法,全局只会执行一次

判断的时候只有一个数组索引取值的操作,如果取出是true 就证明是空白字符...多么简单的逻辑啊

系统方法我没有太深入的研究..除非.. CharUnicodeInfo.InternalGetCategoryValue 方法在运行中有可能改变返回的结果,否则我的方法将和系统方法的返回值是一样的

同理,再顺便写一个判断char的

///<summary>指示指定的 Unicode 字符是否属于空白类别。(比系统的破方法快)///</summary>///<param name="str">要计算的 Unicode 字符。</param>///<returns></returns>publicstaticboolIsWhiteSpace(thischarvalue)

{return_WhiteChars[value];

}

后话刚学.net的时候,那时csdn还非常火,依稀记得,当时在csdn论坛有各式各样的攻擂贴,其中就有不少挑战系统方法的

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

也就是在那时,我知道了系统方法也终究只是人写的,只要是人就一定存在人外人

技术就是古代武学一样(我经常把设计模式比作武功套路),所谓文无第一武无第二,说的就是武功的好坏一比就知道了,技术也是一样

多学习,多研究,多观察,多测试. 真正把一个方法,一个类搞懂,你自然就知道他的好坏

不要盲目的崇拜谁,只要是XXX就一定是最好的! 凭我N年的经验,这样是最好的! 都没有说服力! 都是程序猿,咱们拿代码说话

广告更多C#技术交流,欢迎加群:5946699;暗号:C#交流

欢迎喜欢C#,热爱C#,正在学习C#,准备学习C#的朋友来这里互相学习交流,共同进步

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航