【转】三种常用的字符串判空串方法

1. 三种常用的字符串判空串方法:
Length法:bool isEmpty = (str.Length == 0);
Empty法:bool isEmpty = (str == String.Empty);
General法:bool isEmpty = (str == "");

2. 深入内部机制:
要探讨这三种方法的内部机制,我们得首先看看.NET是怎样实现的,也就是要看看.NET的源代码!然而,我们哪里找这些源代码呢?我们同样有三种方法:
Rotor法:一个不错的选择就是微软的Rotor,这是微软的一个源代码共享项目。
Mono法:另一个不错的选择当然就是真正的开源项目Mono啦!
Reflector法:最后一个选择就是使用反编译器,不过这种重组的代码不一定就是原貌,只不过是一种“近似值”,你可以考虑使用Reflector这个反编译器[1]。
这里我采用Reflector法,我们先来看看一下源代码[2](片段):

public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable, IComparable<string>
{
    static String()
    {
        string.Empty = "";

        // Code here
    }

    // Code here

    public static readonly string Empty;

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

    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;
    }

    private static unsafe bool EqualsHelper(string ao, string bo)
    {
        // Code here

        int num1 = ao.Length;
        if (num1 != bo.Length)
        {
            return false;
        }
       
        // Code here
    }

    private extern int InternalLength();

    public int Length
    {
        get
        {
            return this.InternalLength();
        }
    }

    // Code here
}

Rotor里面String类的代码与此没什么不同,只是没有EqualsHelper方法,代之以如下的声明:

public extern bool Equals(String value);

进一步分析:
首先是Empty法,由于String.Empty是一个静态只读域,只会被创建一次(在静态构造函数中)。但当我们使用Empty法进行判空时,.NET还会依次展开调用以下的方法,而后两个方法内部还会进行对象引用判等!

public static bool operator ==(string a, string b);

public static bool Equals(string a, string b);

private static unsafe bool EqualsHelper(string ao, string bo);

若使用General法判等的话,情况就“更胜一筹”了!因为.NET除了要依次展开调用上面三个方法之外,还得首先创建一个临时的空字符串实例,如果你要进行大量的比较,这恐怕是想一想就很吓人了!
而对于Length法,我们就可以绕过上面这些繁琐的步骤,直接进行整数(字符串长度)判等,我们知道,大多数情况下,整数判等都要来得快(我实在想不出比它更快的了,在32位系统上,System.Int32运算最快了)!
另外,我们还可以看到,在EqualsHelper方法里面.NET会先使用Length法来进行判等!可惜的是我无法获得InternalLength方法的代码。但我在Mono的源代码里面看到更简明的实现:

class String
{
    private int length;

    public int Length
    {

        get
        {
            return length;
       
        }
    }

    // .
}

然而使用Length法进行字符串判空串时,有一点要注意的,就是你必须先判断该字符串实例是否为空引用,否则将会抛出NullReferenceException异常!于是,我们有了一个经过改进的Length法:

void Foo(string bar)
{
    if ((bar != null) && (bar.Length == 0))
        //
}

3. 最后总结:
从上面的分析我们可以看到,使用Length法来进行字符串判空串是有着很大的性能优势的,尤其在进行大量字符串判空时!当然首先得判断字符串实例是否为空引用!

时间: 2024-10-06 04:07:05

【转】三种常用的字符串判空串方法的相关文章

Java字符串简单使用方法

Java字符串类型为String类,以下介绍怎样操作字符串. 1.字符串连接 字符串连接使用"+"符号.例如以下样例: String s = new String("Hello"); String s2 = new String("World"); System.out.println(s + " " + s2); // Hello World 2.获取字符串长度 获取字符串长度使用str.length().例如以下样例: S

AC日记——字符串判等 openjudge 1.7 17

17:字符串判等 总时间限制:  1000ms 内存限制:   65536kB 描述 判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等. 输入 两行,每行包含一个字符串. 输出 若两个字符串相等,输出YES,否则输出NO. 样例输入 a A bb BB ccc CCC Aa BBbb CCCccc 样例输出 YES 思路: 大模拟: 来,上代码: #include<cstdio> #include<string> #include<cstring>

7.python字符串-内置方法分析

上篇对python中的字符串进行了列举和简单说明,但这些方法太多,逐一背下效率实在太低,下面我来对这些方法安装其功能进行总结: 1.字母大小写相关(中文无效) 1.1 S.upper() -> string 返回一个字母全部大写的副本 1.2 S.lower() -> string 返回一个字母全是小写的副本 1.3 S.swapcase() -> string 返回一个字母大小写转换后的副本 1.4 S.title() -> string 将单词的首字母大写,即为所谓的标题 方框

JS总结之一:字符串的调用方法

字符串的调用方法:var s="hello, world";document.write(s.charAt(0)); //第一个字符document.write(s.charAt(s.length-1)); //最后一个字符document.write(s.substring(1,4)); //第2~4个字符document.write(s.slice(-3)); //最后3个字符document.write(s.indexOf("l")); //字符l首次出现的位

Oracle字符串连接的方法

Oracle数据库中,使用“||”进行字符串连接,下面就让我们一起了解一下Oracle数据库中字符串连接的方法,希望对您能有所帮助. 和其他数据库系统类似,Oracle字符串连接使用“||”进行字符串拼接,其使用方式和MSSQLServer中的加号“+”一样. 比如执行下面的SQL语句:SELECT '工号为'||FNumber||'的员工姓名为'||FName FROM T_EmployeeWHERE FName IS NOT NULL 除了“||”,Oracle还支持使用CONCAT()函数

深入.Net字符串类型 Join方法

.Net的字符串其实还是有很多东西可以写的.但是最近在学习SQL Server,只好先做下最近学习到的一些巧用,妙用之类的东西. 巧用String.Join拼接字串数组,字符串集合为字符串.如果在之前,一个foreach早就敲上去了.虽然效率差多,但是少了个foreach,还是美观不少的. class Program { static void Main(string[] args) { List<string> listStr = new List<string>(); list

17:字符串判等

17:字符串判等 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等. 输入 两行,每行包含一个字符串. 输出 若两个字符串相等,输出YES,否则输出NO. 样例输入 a A bb BB ccc CCC Aa BBbb CCCccc 样例输出 YES #include<iostream> #include<cstdio> #include<cstring> u

Python 字符串分割的方法

在平时工作的时候,发现对于字符串分割的方法用的比较多,下面对分割字符串方法进行总结一下:第一种:split()函数split()函数应该说是分割字符串使用最多的函数用法:str.split('分割符')通过该分割操作后,会返回一个列表. 注:当然如果你的字符串含有一个或者多个空格就直接 str.split() 就可以了 例如: >>> a = "hello,python,Good Night" >>> a.split(',') ['hello', '

ASP.NET C# 去掉字符串中间空格方法

 string strName = "大     张     伟";             string str = Regex.Replace(strName, @"\s", "");             Response.Write("输出内容:" + str); ASP.NET C# 去掉字符串中间空格方法,布布扣,bubuko.com