Jester Zhu

从学习中得到乐趣,从乐趣中得到灵感,从灵感中创造真知。Think well,just do it.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
    对于那些不太重视.NET基础的朋友们来说,想知道上述三者之间的详细区别,或许还真有点难度。
    我第一次碰到这个问题是在一次面试的时候,下面就允许我说说我的愚见:
    首先,先说说string s = null和string s = ""二者间的区别。从字面意义上理解,二者都是给变量初始化为空,前者可以联想Object,那么可以说“初始化为空引用”;后者呢可以说“初始化为空值”。看来二者间确实存在一种“不可告人的秘密”,当然这种区别仅仅是我们从肤浅的感性认识上的理解。从理论上说string s = null是不给它分配存储空间的,而string s = ""是给它分配一个长度为空的存储空间。
本人愚见,既然我们从感性上认识string s = ""为“空值”,而且String类型也是引用类型,那么它当然应该在上占个“坑位”,里面存个空值,而栈上保存的指向堆的一个指针。而string s = null 就不一样了,既然认为是“空引用”,那么它99.9%会在上占个“坑位”里面有个指针不指向任何地方(换句话说堆上没有任何值)。
    其次,我们说说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 == "" ,三者的性能也随着逐渐降低。
    希望有不对的大家能够及时指出,谢谢!