C#中判断空字符串的3种方法性能分析

作者:清清月儿

主页:http://blog.csdn.net/21aspnet/           时间:2007.4.28

 3种方法分别是:
string a="";
1.if(a=="")
2.if(a==String.Empty)
3.if(a.Length==0)

3种方法都是等效的,那么究竟那一种方法性能最高呢?本人用实验说明问题。

建立3个aspx页面(为什么用网页,主要是利用Microsoft Application Center Test

WebForm1.aspx
private void Page_Load(object sender, System.EventArgs e)
  {
   string a="";
   for(int i=0;i<=1000000;i++)
   {
    if(a=="")
    {
    }
   }
  }

WebForm2.aspx
private void Page_Load(object sender, System.EventArgs e)
  {
   string a="";
   for(int i=0;i<=1000000;i++)
   {
    if(a==String.Empty)
    {
     
    }
   }
  }

WebForm3.aspx
private void Page_Load(object sender, System.EventArgs e)
  {
   string a="";
   for(int i=0;i<=1000000;i++)
   {
    if(a.Length==0)
    {
    }
   }
  }

 在Microsoft Application Center Test 下建立3个压力测试项目:

测试结果:

WebForm1.aspx----------if(a=="")


WebForm2.aspx-------if(a==String.Empty)


WebForm3.aspx-------if(a.Length==0)

所以3种方法量化的结果是98,105,168:

方法结果
if(a=="")98
if(a==String.Empty)105
if(a.Length==0)168

那么为什么if(a.Length==0)最快呢?
因为整数判断等于最快,没有经过实例化等复杂的过程。

所以:建议大家判断字符串是否为空用 if(a.Length==0)。

 

对于三种方法的评价:

1.if(a=="") // ""需要实例化一个String对象,最差
2.if(a==String.Empty) // String.Empty是常量,不需要实例化
3.if(a.Length==0) // a.Length虽然最快,但是语意不如第2种清晰

另,String.IsNullOrEmpty(value)判断的是该字符串是非为空,或者为空字符串.

结论:推荐使用2.if(a==String.Empty),安全,稳定,语意清晰.

 

-----------------------------------------------------------------------------------

 

 

呃 通常我为了防止变量为null,最方便的写法是
if(a + "" == "")...
不然就需要两个if了
-----------------------------------------------------------------------

如果a是null的话,那么会报:未将对象引用设置到对象实例

不会报错。C#里任何类型的任何值,包括null,都可以与string类型的值无责任相加。这是因为被string重载的+运算符自动调用了另一加数的ToString()方法,这一方法是被所有类型的基类object实现的。

 

---------------------------------------------------------------------------------------

 

一堆白痴啊,这种比较是很长用的,如果在大量的循环里面使用是非常能改善性能的,其实这个性能的差异我早知道,不过第一次看到楼主把他写出来,非常不错。

那些觉得没必要的,你们根本不是合格的程序员,如果世界上没有.net,你们是第一批被淘汰的程序员。都是被宠坏的孩子。

建议在学校先学学C++吧。

楼上那个更白痴,居然还问这种问题“如果a=" "中间有好多空格呢?a.length还是0吗?”

好好问问你自己吧

 

--------------------------------------------------------------------------------------------

 

>>将10个小字符串累加起来形成一条长字符串,如果你用了9个“+”号的话,那你的程序能卖出去才怪。
>>那要怎么样才好啊

用九个+号的话会造成产生9个临时的字符串对象,需要分配10次内存空间,垃圾回收器要回收9次。

当然先分配一段缓存,再把10个字符串复制过去啦,简单讲就是用StringBuilder或String.Join来并接

这些算是基础的知识了。

 

-----------------------------------------------------------------------------------

 

对于楼主提到的 somevar.Length==0 的方法,基本上什么语言都是这样判断的,无论是vb6,java,.net,而不仅仅限制于c#,但是如果不是很确定somevar是否为null,使用 somevar==string.Empty也是一个不错的方法。

 

---------------------------------------------------------------------------------

 

string.lenght 语义是清晰的。

这没什么错,但是不太符合习惯。习惯是可以培养的。

空字符串的语义是长度为0的字符串,直接判断长度是没错的。

唯一的毛病就是null,null的语义是空对象,如果可以把空对象赋值给string类型,那么说明,string类型必须能够解释null类型含义。

null类型就是无类型,它不含字符串长度这样的定义。所以string对null进行解释的时候必须要进行类型匹配。如果把null解释成为长度为0的字符串也是不合理的。必须进行特殊的解释。

如果string对null进行了特殊的解释,那么使用长度来判断是否空字符的语义就是不正确的。

空字符串的语义就应当是,除了null之外长度为0的字符串,或者说具有长度属性但是为0的字符串。

增加一个判断就会增加一次开销,实际上在使用string.empty的时候,运算符重载的函数会进行null判断,然后判断长度。如果左侧的string为null就不会调用那个重载的运算符判断。

如果string.length判断增加了类型检查,那么效率等同于string.empty的判断。

之所以效率高,是因为TZ对空字符串的理解存在缺陷。

 

------------------------------------------------------------------------------

 

>># 未名 发表于2007-04-28 22:25:38 IP: 219.137.160.*
>>将10个小字符串累加起来形成一条长字符串,如果你用了9个“+”号的话,那你的程序能卖出去才怪。
>>那要怎么样才好啊

用九个+号的话会造成产生9个临时的字符串对象,需要分配10次内存空间,垃圾回收器要回收9次。

当然先分配一段缓存,再把10个字符串复制过去啦,简单讲就是用StringBuilder或String.Join来并接

这些算是基础的知识了。
============================================
貌似雄台基础知识也不太行
如果是10个字符串相加的话,只要数量已知,性能就是很高的,并不会比StringBuilder差,甚至会因为分配小区内存和静态优化性能更好。使用StringBuilder的话适合不定量的字符串相加,或者是分多次累加。至于你说的垃圾收集的问题,StringBuilder并不会比String直接相加更加有优势,StringBuilder也是复制字符串里面的内容,它也不是链表
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值