做项目的过程中,遇到一个疑问,在处理字符串判断的时候,有三四种甚至更多方法,如果要判断字符串是否为空的话有这样几种办法:

s.Length==0、 s==string.Empty、s=="" s==null

疑问就出来了,哪种办法好呢,还是用&&连接起来全部判断?

想必对于那些不太重视.NET基础的朋友们来说,对于知道上述三者之间的详细区别,或许还真有点难度。   
首先,先说说string s = null和string s = ""二者间的区别。从字面意义上理解,二者都是给变量初始化为空,前者可以联想Object,那么可以说“初始化为空引用”;后者呢可以说“初始化为空 值”。看来二者间确实存在一种“不可告人的秘密”,当然这种区别仅仅是我们从肤浅的感性认识上的理解。从理论上说string s = null是不给它分配存储空间的,而string s = ""是给它分配一个长度为空的存储空间。
    其次,我们说说string s = string.Empty和string s = null的区别。在这里还想说说string和String的区别,二者我们在Visual Studio环境下开发时,根本看不出来区别,因为通过智能感知反馈给我们的信息都是“表示文本,既一系列Unicode字符”。呵呵蒙了吧!我们知道, 在.NET中所有引用类型和值类型都是继承自一个根类型Object,而这些“东西的”赖以生存的环境就是CTS,因为它们是在CTS中定义的,同时 CTS也是依赖CLR的,所以没有CLR也就没有CTS。言归正传,我的愚见是String是大哥,因为他是在CTS中就定义好的东西了,是基于CLR 的。而string仅仅是C#语法中一个String的变体,是基于C#的。二者好像没什么区别,只是在不同的环境下,特定的一种符号而已,不知道这么理 解对不对?呵呵
好了,string.Empty和null是这样的,他俩都表示空,前者是一个空字符串,只不过这个字符串的值为空,但是在内存的 堆中是有准确指向的,而后者只是定义了一个string 类型的引用,变量并没有指向任何地方,还是那句话它 99.9%可能会在堆栈上占个“坑位”,里面有个指针不指向任何地方。在使用前如果不实例化,都将报错。
    最后,通过上述我们还可以知道有3种方法可以表示字符串为空,s.Length == 0 , s == string.Empty , s == "" ,三者的性能也随着逐渐降低。