A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

判断空字符string.Empty,null与""三者的区别是什么?

20 个回复

正序浏览
不一样的吧
回复 使用道具 举报
String.empty不会为对象分配存储空间。
“”为String对象分配一个长度为0的存储空间。
null是一个空地址
回复 使用道具 举报
string.Empty与""是一样的,实际上Empty是string类中的一个静态的只读字段,他的定义是这样的:

  public static readonly String Empty = "";
 
也就是说string.Empty的内部实现是等于””的。
如果非要说出有什么不同的话,只能说优化方面稍有差别。string.Empty于c#对""在语法级别的优化。这点可以通过string.Empty的内部实现看出来。

  public static readonly String Empty = "";

  也就是说""是通过CLR进行优化的,CLR会维护一个字符串池,以防在堆中创建重复的字符串。而string.Empty是一种c#语法级别的优化,是在C#编译器将代码编译为IL(即MSIL)时进行了优化,即所有对string类的静态字段Empty的访问都会被指向同一引用,以节省内存空间。
  所以对""的优化更依赖CLR。
因为string.Empty与””基本是一样的,所以string.Empty与null的区别也就代表了””与null的区别。
    那就是string.Empty会在堆上占用一个长度为0的空间,而null不会。具体内容如下:

  string str1=””;
  string str2=null;

  如刚才所说str1会在栈上保存一个地址,这个地址占4字节,指向内存堆中的某个长度为0的空间,这个空间保存的是str1的实际值。
  str2同样会在栈上保存一个地址,这个地址也占4字节,但是这个地址是没有明确指向的,它哪也不指,其内容为0x00000000。

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
string.Empty和""  都是给一个字符串赋了控制
Null 是空地址。就是还木有地址

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
楼主请将帖子改成已解决 方便我们加分,黑马有你更精彩
回复 使用道具 举报
黑马蔡红微 发表于 2013-10-31 09:38
请设置成已解决,这样才能给你本人加分。

:L不知道怎么设置............
回复 使用道具 举报
请设置成已解决,这样才能给你本人加分。
回复 使用道具 举报
如问题得到解决,请及时把分类修改为"已解决",这样版主才能给你加分!黑马有你更精彩!
回复 使用道具 举报
你可能还不太了解,它们三者的关系,当你把它写成这样就很清楚了,如下:

string str1=string.empty;:表明str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的
string str2 =null;:只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错
string str3="";声明了一个为空的字符串,

一般情况下 string.empty 和 “”是可以互换的使用的

根据先人的经验,判断字符串是否为空的最快的方法是
判定为空字符串的几种写法,按照性能从高到低的顺序是:s.Length == 0   其次是 s == string.Empty      再次是 s == ""

希望对你有所帮助
回复 使用道具 举报
null 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果 int i=null,的话,是不可以的,因为Int是值类型的。
string.Empty与""都会分配存储空间,具体的说是都会在内存的栈和堆上分配存储空间。
有一点先说明一下,引用类型是将对象是实际数据保存在堆上, 将对象在堆上的地址保存在栈上。因此string.Empty与””都会在栈上保存一个地址这个地址占4字节,指向内存堆中的某个长度为0的空间,这个空间保存的是string.Empty的实际值

如果非要说" "与string.Empty有什么不同的话,我觉得1是写法不一样,string.Empty看起来好看~!~。2是在优化方面稍有差别。string.Empty于c#对" "在语法级别的优化。这点可以通过string.Empty的内部实现看出来。

  public static readonly String Empty = " ";

也就是说" "是通过CLR进行优化的,CLR会维护一个字符串池,以防在堆中创建重复的字符串。而string.Empty是一种c#语法级别的优化,是在C#编译器将代码编译为IL(即MSIL)时进行了优化,即所有对string类的静态字段Empty的访问都会被指向同一引用,以节省内存空间,所以对" "的优化更依赖CLR。

因为string.Empty与””基本是一样的,所以string.Empty与null的区别也就代表了””与null的区别。

那就是string.Empty会在堆上占用一个长度为0的空间,而null不会。

回复 使用道具 举报
李洋 中级黑马 2013-10-27 09:40:43
11#
给你举个房子装修的例子吧:
你目前房子都没有,就是NULL(根本就谈不上装修,就是说内存都没分配,谈不上值)
"" 你有房子但是没有装修,而且很直接(内存分配了,但是值是空值)
String.Empty 就是毛胚房(同样是内存分配了,是空值)
没有装修的房子从用的角度来看完全等于毛胚房(也就""和String.Empty从执行效率来看是完全一样)
但从语言角度来看,毛胚房是经过优化的语言,更具有代表和专业性,但不一定通俗易懂。(也就是从语法以及C#编译IL阶段String.Empty 比""优化了一些,仅仅是语法上而已,但String.Empty更符合面向对象,但不一定人人懂,而""是个人都知道,从专业的角度来看还是建议String.Empty)
以上卓见,不知道你懂了吗
回复 使用道具 举报
string.Empty和""可以互换都表示空,但是在内存中开辟了空间;
你可以用控制台输出他们的长度
string str1 = string.Empty;
            string str2 = "";
            string str3 = null;
            Console.WriteLine(str1.Length);
            Console.WriteLine(str2.Length);
            Console.WriteLine(str3.Length);
            Console.ReadKey();
你会发现str1,和str2输出的都是0;   而str3会报错,因为内存中没有开辟空间,无法访问
回复 使用道具 举报
string.Empty和""都表示空,但是在内存中开辟了空间;
null则理解为没有在内存中开辟空间
回复 使用道具 举报
如问题得到解决,请及时修改为"以解决",黑马有你更精彩!
回复 使用道具 举报
string str=null   string str=""   string str=string.Empty 三种的区别
第一种写法,只是在栈中开辟了一个内存,在堆中并未开辟内存
第二种写法,在栈中开辟了内存,在堆中也开辟了一个内存,但是堆中的内容为空
第三种写法同第二种写法

            string str = null;
            string msg = "";
            string txt = string.Empty;  

&str
0x056bebf0
    str: 0x00000000
&msg
0x056bebec
    msg: 0x01b21198
&txt
0x056bebe8
    txt: 0x01b21198

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
string.Empty和""是一样的效果,
我经常用的就是string.Empty;
但是string.Empty和""是有区别的!
string.Empty是在内存中有一个专门用来存放Empty的空间,然后,别的用到Empty的时候,都志向它
""就是在内存中单独再开一个""空间,可想而知,如果你定义的多的话,那么就很消耗内存的,
null就是不指向任何,指向不明确,

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
string.Empty与""一样的都是指向的值是空,null是指向的地址不明确
回复 使用道具 举报
String.Empty  与 ""  大多数情况下可以互换的,二null就是没有地址,,""有地址但是值为 ""  空的

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
string str1="";   string str2=null;   string str3=string.Empty;
srt1和str3都是分配了储存空间,只不过是长度为空的存储空间;而str2没有分配储存空间,没有指向。
在 C# 中,大多数情况下 "" 和 string.Empty 可以互换使用。
比如:
string s = "";
string s2 = string.Empty;
if (s == string.Empty) {
//
}
if语句成立
判定为空字符串的几种写法,按照性能从高到低的顺序是:
s.Length == 0 优于 s == string.Empty 优于 s == ""

自己尽量多找找答案吧,这个就是在论坛找的  囧!

评分

参与人数 1技术分 +1 收起 理由
追溯客 + 1

查看全部评分

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马