作者:清清月儿
主页: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),安全,稳定,语意清晰.
-----------------------------------------------------------------------------------
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来并接
这些算是基础的知识了。
-----------------------------------------------------------------------------------
---------------------------------------------------------------------------------
这没什么错,但是不太符合习惯。习惯是可以培养的。
空字符串的语义是长度为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对空字符串的理解存在缺陷。
------------------------------------------------------------------------------
>>将10个小字符串累加起来形成一条长字符串,如果你用了9个“+”号的话,那你的程序能卖出去才怪。
>>那要怎么样才好啊
用九个+号的话会造成产生9个临时的字符串对象,需要分配10次内存空间,垃圾回收器要回收9次。
当然先分配一段缓存,再把10个字符串复制过去啦,简单讲就是用StringBuilder或String.Join来并接
这些算是基础的知识了。
============================================
貌似雄台基础知识也不太行
如果是10个字符串相加的话,只要数量已知,性能就是很高的,并不会比StringBuilder差,甚至会因为分配小区内存和静态优化性能更好。使用StringBuilder的话适合不定量的字符串相加,或者是分多次累加。至于你说的垃圾收集的问题,StringBuilder并不会比String直接相加更加有优势,StringBuilder也是复制字符串里面的内容,它也不是链表