A scientist builds in order to learn; an engineer learns in order to build.
posted on 2004-10-28 14:34 阮 阅读(8016) 评论(21) 编辑 收藏 网摘 所属分类: Dot NET
string == " " 会被翻译成 string.Equal(" ") 所以效率会低一些,因为String实际是一个类,string.Length调用的属性,而string == " "则会调用函数,还要建立临时变量,所以效率肯定大打折扣 个人理解,也许有误,仅做参考 回复 引用
你自己可以更改Fxcop里的规则。把认为不适合自己的给去掉。 回复 引用 查看
thanks. 回复 引用 查看
恩,其实我想知道为什么会有这条规则。 回复 引用 查看
微软的朋友最喜欢用 if (str != null && str.Length > 0),因为这样更快。 回复 引用 查看
String.Empty就是一个""的存放版。你用这个就应该没事了吧。 回复 引用
thanks all. 回复 引用 查看
@Ninputer 我用 TextBox.Text == String.Empty,虽然警告级别下降了,但是还是提示用Length判断,难道MS真的就认可.Length是最快的? 回复 引用 查看
@msolap 那样应该是很快,但是还是跟Length扯上关系了,也就正中了那条规则的下怀了。 回复 引用 查看
因为str1==str2的第一步就是检查str1.Length==str2.Length 所以如果比较的是 str1=="" ,那么直接比较str1.Length==0好了。 回复 引用
@Lostinet 这个原因还是比较好接受的,记下有时间试试。 回复 引用 查看
你...真的用它来进行QA.....强........ 回复 引用 查看
我也用它检查。。。。。 口亥口亥。。。。。 回复 引用
其实进行整数换算应该是比较快的;而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 == ""; 希望这些能够给你一点启示。 回复 引用
@Allen Lee 感谢。 “因为str1==str2的第一步就是检查str1.Length==str2.Length”,如果你还能来看看,顺便问你一句,你对这句话做何感想^_^。 回复 引用 查看
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的开源版)的源代码的。希望这些对你有所帮助。 回复 引用 查看
@Allen Lee Great! 真是太感谢你了。 回复 引用 查看
To 阮: 迷底终于解开了!我写了一篇《如何判断字符串是否为空串?》来讲述你这个问题,经过一番测试后,结果的确如Lostinet所说的。而“因为str1==str2的第一步就是检查str1.Length==str2.Length”这个谜团也得以解开,结论是不准确但有道理。希望这篇文章对于你理解这个问题有帮助。 回复 引用 查看
昵称: [登录] [注册]
主页:
邮箱:(仅博主可见)
验证码: 看不清,换一个
评论内容:
登录 注册
[使用Ctrl+Enter键快速提交评论]
Powered by: 博客园 Copyright © 阮