Talking about 判断空字符串的问题

That’s right. Looking at Length property equals to zero or not will be much faster than string equality comparison. In a more common case, use IsNullOrEmpty method instead in .net 2.0. This method checks the coming argument null or not, and then call String.get_Length to compare with 0.

Quote

判断空字符串的问题

一般人都喜欢用 (a==null || a=="" )来判断字符串是否是空的,也有部分人会用 String.IsNullOrEmpty(a)来判断(这里要大骂一下微软写MSDN帮助的人,这个方法的说明居然明显地写错了,包括IDE中的代码提示也是错的!!也许因此很多人本来知道这个方法的却被这个提示给误导了!)

现在回到假设已经知道a不是null的情况,我们需要判断a是否是空字符串,如何判断呢? a=="" 估计是大部分人的选择,当然这个时候继续用String.IsNullOrEmpty(a)也是无可厚非的,但是毕竟多了一句废代码, 也许大部分人认为把一个字符串和""比较是一个简单的操作,不过事实上并不是这样~~~~~~~

让我们ILDASM一下,看看这个 == 运算符到底做了什么事:

代码首先是把null的情况当特殊情况先处理了,然后

(省略了MSIL equalhelper代码)
是否感觉有些可怕?在a是空字符串的情况下,2个空字符串比较将会执行多少代码啊,首先是先比较字符串的长度,如果长度不同则返回假,可是此时2个字符串都是长度为0所以不符合这个条件,这个分别锁住a和""这两块内存,然后初始化4个指针来指向它们,再用2个复杂的循环和表达式运算,移动指针比较(很庆幸,由于是空字符串,2个循环实际上分别只判断了一次,并不会执行循环体)然后再判断字符串的长度~~~~ 至此,a=="" 返回了一个true ~~~

事实上事情本可以更加简单得多,如果我们使用另外一个表达式 a.Length == 0 则世界将美好许多,不再需要指针,不再需要那些复杂的语句,我们需要的仅仅是:

.method public hidebysig specialname instance int32 get_Length() cil managed internalcall

事实上在上面的L_0001和L_0009的最终语句里这句话已经被调用了2次了~~~

所以下次需要判断一个字符串是不是空字符串的时候,使用a.Length==0要比a=="" 执行起来快得多,需要执行的机器指令也少得多!

Leave a Reply

Your email address will not be published.