.NET学习笔记-2:C#中判断空字符串的4种方法性能比较与分析

结果分析来看,调用string的length==0作比较,不论字符串是否为空,此方法的效率最高,此点与清清月儿的结果一致;

string的isNullOrEmpty()方法的效率基本不变,无论字符串是否有值;

== string.Empty== ""两种方法在3个变量测试的实验中效率相对较低,但是两者再和对方比较的时候会出现效率降低的情况,见上图;

【3】原因剖析:

  原因是什么呢?我们来看看对应的il代码:

1.locals init ([0] class [System]System.Diagnostics.Stopwatch sw, 
 2                     [1] string sEmpty1, 
 3                     [2] string sEmpty2, 
 4                     [3] string sEmpty3, 
 5                     [4] int32 i, 
 6                     [5] bool CS$4$0000) 
 7    IL_0000:    nop 
 8    IL_0001:    newobj         instance void [System]System.Diagnostics.Stopwatch::.ctor() 
 9    IL_0006:    stloc.0 
10    IL_0007:    ldsfld         string [mscorlib]System.String::Empty//将指定字段的值推送到堆栈上。 ldsfld 指令将静态(在类的所有实例中共享)字段的值推送到堆栈上。返回类型是与传递的元数据标记 field 关联的类型。 
11 
12    IL_000c:    stloc.1 
13    IL_000d:    ldstr            ""//将对字符串的对象引用推送到堆栈上,ldstr 指令推送对表示在元数据中存储的特定字符串的新字符串对象的对象引用(O 类型)。 
14    IL_0012:    stloc.2 
15    IL_0013:    ldstr            "StringNotEmpty"//将对字符串的对象引用推送到堆栈上,ldstr 指令推送对表示在元数据中存储的特定字符串的新字符串对象的对象引用(O 类型)。 
16    IL_0018:    stloc.3 
17    IL_0019:    ldloc.0

两者的差别由于推送到堆栈上的内容不同,前者是静态共享值推送到堆栈,后者是字符串对象的地址推送到堆栈.

造成的比较差别.另外字符串值是否相等的资料大家可以看看园子里缘清的文章,有很好的参考价值.地址:http://www.cnblogs.com/isline/archive/2009/02/04/1383799.html.希望大家一起交流!


你可能感兴趣的:(字符串)