判断字符串变量str是否为空的一下三种方法哪个性能更优

threemonths 2007-01-20 09:31:44
判断字符串变量str是否为空的一下三种方法哪个性能更优:a、str=="";b、str==String.Empty;c、str.Length==0;?

据说答案是C,不太明白,请问为什么啊?

谢谢~~
...全文
1951 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
datahandler2 2009-02-27
  • 打赏
  • 举报
回复
他妈的,今天去面试叫我做这道变态题。这么会钻牛角尖的问题。没多大意义。
即使不懂那个性能比较好也无所谓。反正微呼其呼。真搞不懂这样给我测试有何意义。
叫我应用我会选择综合考虑,一个是可读性另一个是不会过分影响性能。
妈妈的考我反射原理 委托我临时记不起来我没话说,毕竟这个涉及到复杂系统的高级运用。考这破题真的超级无语了半天。
tianjh 2007-01-22
  • 打赏
  • 举报
回复
string.IsNullOrEmpty();
这个方法是标准方法,实际上也是上面有些人用的方法。这是.NET自已封的方法。我用工具反译了一下,这就是它的代码原型:

public static bool IsNullOrEmpty(string value)
{
if (value != null)
{
return (value.Length == 0);
}
return true;
}
基本上和大家的做法是一样的,所以说还是建议使用系统自带的,这样也省事,图个方便嘛,对不对?

asp_m 2007-01-22
  • 打赏
  • 举报
回复
经过上面程序的调试,第一个明显快了好多好多。 第二和第三基本差不多
wood542344 2007-01-22
  • 打赏
  • 举报
回复
上CSDN每天都可以学到很多东西啊。记下了。
magicmaster 2007-01-22
  • 打赏
  • 举报
回复
比性能,还是用C++吧
koenemy 2007-01-22
  • 打赏
  • 举报
回复
这得有上下文,,,,
要不没法说哪个快
小小暴徒 2007-01-22
  • 打赏
  • 举报
回复
学习
nyzfl 2007-01-22
  • 打赏
  • 举报
回复
学习

------------------------
http://fenglin.xland.cn
------------------------
LoveCherry 2007-01-22
  • 打赏
  • 举报
回复
to:xiaotupansy(中)
用stopwatch测时间间隔会准确一些:)
lubosun 2007-01-22
  • 打赏
  • 举报
回复
string.IsNullOrEmpty(str)
chinawin2012 2007-01-22
  • 打赏
  • 举报
回复
学习
chenghp 2007-01-22
  • 打赏
  • 举报
回复
我靠。。。强。。。了解了。str.Length==0;?
tongxilai 2007-01-22
  • 打赏
  • 举报
回复
1. C# 和 C++ 不一样:不是采用0结尾的。

2. 由于原因1,调用Length属性(get_Length方法)时,应该不会通过遍历每个字符串直至尾部来取得。而估计是读取String的private字段:m_stringLength。

3. CLR对于字符串常量(注意:常量)采用字符串驻留机制(Microsoft.NET.框架程序设计 12.2.4节):即用一个散列表保存字符串常量。
比如代码:
string s1 = "hello world";//在散列表中查找“hello world”,结果没找到,就把“hello world”填到了散列表中,并返回引用给s1
string s2 = "hello world";//找到了“hello world”,返回它的引用给s2
所以,上面的s1和s2指向同一个字符串而非两个

4. 基于原因3, String类在判断两个相等时,先判断两个字符串是否指向同一个,即这是两个引用(Int32 变量)比较,见下面String类的代码:(op_Equality会调用下面的)
public static bool Equals(string a, string b)
{
if (a == b)
{
return true;
}
if ((a != null) && (b != null))
{
return string.EqualsHelper(a, b);
}
return false;
}
可见,
string s1 = "";
string s2 = "hello world";
bool b1 = s1 == "";//语句3
bool b2 = s2 == "";//语句4
同样使用 == "";方式语句3的速度也比语句4快。

5.下面我写了一个StringEmply类,代码如下:
public class StringEmpty { public static bool A(string str) { return str == ""; }
public static bool B(string str) { return str == string.Empty; }
public static bool C(string str) { return str.Length == 0; } }
用Dasm反汇编得到下列代码
.method public hidebysig static bool A(string str) cil managed{ // 代码大小 12 (0xc) .maxstack 8 IL_0000: ldarg.0 IL_0001: ldstr "" IL_0006: call bool [mscorlib]System.String::op_Equality(string, string) IL_000b: ret} // end of method StringEmpty::A
.method public hidebysig static bool B(string str) cil managed{ // 代码大小 12 (0xc) .maxstack 8 IL_0000: ldarg.0 IL_0001: ldsfld string [mscorlib]System.String::Empty IL_0006: call bool [mscorlib]System.String::op_Equality(string, string) IL_000b: ret} // end of method StringEmpty::B
.method public hidebysig static bool C(string str) cil managed{ // 代码大小 10 (0xa) .maxstack 8 IL_0000: ldarg.0 IL_0001: callvirt instance int32 [mscorlib]System.String::get_Length() IL_0006: ldc.i4.0 IL_0007: ceq IL_0009: ret} // end of method StringEmpty::C
B 较 A 多走一步: string [mscorlib]System.String::Empty的结果一定是""
综上,个人认为:
C > A > B
我对查看内部代码时,还存在一些不能确定的问题。所以请各位仁兄指正:对在那里;错在哪里。以满足大伙的好奇心。谢!
声明:允许骂娘。

xiaotupansy 2007-01-22
  • 打赏
  • 举报
回复
using System;
public class strLengthTime
{
public static void Main()
{
string strTest = "";
string strSub;
for (int i = 0; i < 1000; i++)
{
strSub = i.ToString();
strTest = strTest + strSub;
}
DateTime startTime;
DateTime endTime;
TimeSpan timeCost;
startTime = DateTime.Now;
for (int m = 0; m < 100000000; m++)
{
if (strTest.Length == 0)
{
}
}

endTime = DateTime.Now;
timeCost = endTime - startTime;
System.Console.WriteLine("strTest.Length Method Costs:" + timeCost.TotalMilliseconds.ToString());
startTime = DateTime.Now;
for (int m = 0; m < 100000000; m++)
{
if (strTest == string.Empty)
{
}
}
endTime = DateTime.Now;
timeCost = endTime - startTime;
System.Console.WriteLine("String.Empty Method Costs:" + timeCost.TotalMilliseconds.ToString());
startTime = DateTime.Now;
for (int m = 0; m < 100000000; m++)
{
if (strTest == "")
{
}
}
endTime = DateTime.Now;
timeCost = endTime - startTime;
System.Console.WriteLine("The Third Method Costs:" + timeCost.TotalMilliseconds.ToString());
Console.ReadLine();
}
}
事实胜于雄辩
tongget 2007-01-22
  • 打赏
  • 举报
回复
csharpok007 2007-01-21
  • 打赏
  • 举报
回复
学习
CNLAN 2007-01-21
  • 打赏
  • 举报
回复
string.IsNullOrEmpty(str)
自然框架 2007-01-21
  • 打赏
  • 举报
回复
楼上的厉害。
g_lbz 2007-01-21
  • 打赏
  • 举报
回复
明白了。
skyofmy 2007-01-21
  • 打赏
  • 举报
回复
str.Length==0
因为他是str的属性,一般属性都是初使化时就有,所以你 用他是直接就有的,
不用做任何计算。。如果是方法就不同了哈哈
加载更多回复(24)

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧