Just RUN

A scientist builds in order to learn; an engineer learns in order to build.

FxCop告诉我,检查一个字符串是否为空要用string.Length。

估计肯定是出于效率原因了,言外之意就是

string == ““

是效率低下的,

究其原因,string == ““ 要额外建立一个””对象,无形之中浪费了内存不知道偶说地对否,哪位来评评。





。。。。。。

在JScript + IE中得出了相反的结论,.length时间要长于直接比较。

posted on 2004-10-28 14:34 阅读(8016) 评论(21)  编辑 收藏 网摘 所属分类: Dot NET

Feedback

#1楼 2004-10-28 14:48 fans1

string == " "
会被翻译成
string.Equal(" ")

所以效率会低一些,因为String实际是一个类,string.Length调用的属性,而string == " "则会调用函数,还要建立临时变量,所以效率肯定大打折扣

个人理解,也许有误,仅做参考
  回复  引用    

#2楼 2004-10-28 14:51 CoolBug      

你自己可以更改Fxcop里的规则。把认为不适合自己的给去掉。   回复  引用  查看    

#3楼[楼主] 2004-10-28 14:52       

thanks.   回复  引用  查看    

#4楼[楼主] 2004-10-28 14:53       

恩,其实我想知道为什么会有这条规则。   回复  引用  查看    

#5楼 2004-10-28 15:10 msolap      

微软的朋友最喜欢用 if (str != null && str.Length > 0),因为这样更快。   回复  引用  查看    

#6楼 2004-10-28 15:10 Ninputer[未注册用户]

String.Empty就是一个""的存放版。你用这个就应该没事了吧。   回复  引用    

#7楼[楼主] 2004-10-28 15:17       

thanks all.   回复  引用  查看    

#8楼[楼主] 2004-10-28 15:20       

@Ninputer

我用 TextBox.Text == String.Empty,虽然警告级别下降了,但是还是提示用Length判断,难道MS真的就认可.Length是最快的?
  回复  引用  查看    

#9楼[楼主] 2004-10-28 15:26       

@msolap

那样应该是很快,但是还是跟Length扯上关系了,也就正中了那条规则的下怀了。
  回复  引用  查看    

#10楼 2004-10-28 16:15 Lostinet[未注册用户]

因为str1==str2的第一步就是检查str1.Length==str2.Length

所以如果比较的是 str1=="" ,那么直接比较str1.Length==0好了。
  回复  引用    

#11楼[楼主] 2004-10-28 16:42       

@Lostinet

这个原因还是比较好接受的,记下有时间试试。
  回复  引用  查看    

#12楼 2004-10-28 23:52 寒枫天伤      

你...真的用它来进行QA.....强........   回复  引用  查看    

#13楼 2004-10-29 13:33 twodays

我也用它检查。。。。。
口亥口亥。。。。。
  回复  引用    

#14楼 2004-11-09 19:45 Allen Lee

其实进行整数换算应该是比较快的;而String作为一个类对象(虽然是基元类型)要进行比较的话,就必须比较String里面保存String字符的field,理论上会比较慢;而String.Empty在.NET的BCL源代码里面是这样声明的:

public static readonly String Empty = "";

于是,把一个string实例与String.Empty比较理论上性能应该介于上面两者,因为它是一个只读静态field,只会创建一次。而且,String的==运算符代码如下:

public static bool operator == (String a, String b)
{
return String.Equals(a, b);
}

可见,进行字符串与“""”的比较会涉及到函数的开销和额外的临时对象创建,正如fans1所说。

根据这些,我个人认为,理论上比较的性能从快到慢是:

bool isEmpty = str.Length == 0;

bool isEmpty = str == String.Empty;

bool isEmpty = str == "";

希望这些能够给你一点启示。
  回复  引用    

#15楼[楼主] 2004-11-10 09:01       

@Allen Lee

感谢。

“因为str1==str2的第一步就是检查str1.Length==str2.Length”,如果你还能来看看,顺便问你一句,你对这句话做何感想^_^。
  回复  引用  查看    

#16楼 2004-11-10 19:36 Allen Lee      

To 阮:
 
我查看了一下.NET String类的源代码,如上面我给出的代码,“==”操作符是调用String.Equals(string a, string b)方法的,我们来看看该方法的代码:
 
public static bool Equals(String a, String b) {
    
if ((Object)a==(Object)b) {
        
return true;
    }

    
    
if ((Object)a==null || (Object)b==null{
        
return false;
    }

    
    
return a.Equals(b);
}

我们可以看到该方法进行了一系列繁琐的比较后再调用Equals(string value)这个实例方法,该实例方法在String里面没有实现(Impletementation),只有如下的声明
 
public extern bool Equals(String value);

综上所述,我觉得“因为str1==str2的第一步就是检查str1.Length==str2.Length”这句话有点问题,可能我个人资力有限,还望他/她本人出来解惑一下。
 
注意,本分析基于微软的http://www.microsoft.com/downloads/details.aspx?FamilyId=3A1C93FA-7462-47D0-8E56-8DD34C6292F0&displaylang=en">Rotor(微软.NET的开源版)的源代码的。希望这些对你有所帮助。
  回复  引用  查看    

#17楼[楼主] 2004-11-11 13:21       

@Allen Lee

Great! 真是太感谢你了。
  回复  引用  查看    

#18楼 2004-11-11 18:25 Allen Lee      

To 阮:
迷底终于解开了!我写了一篇《如何判断字符串是否为空串?》来讲述你这个问题,经过一番测试后,结果的确如Lostinet所说的。而“因为str1==str2的第一步就是检查str1.Length==str2.Length”这个谜团也得以解开,结论是不准确但有道理。希望这篇文章对于你理解这个问题有帮助。
  回复  引用  查看    





发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 57747




相关文章:

相关链接:

My Links

Blog Stats

News

与我联系

搜索

 

常用链接

留言簿

我参与的团队

随笔分类

随笔档案

相册

Favorites

最新评论

阅读排行榜

评论排行榜