关于C#中null,"",empty的差别 本人小白一枚,刚学C#不久,问题如题,都说""会为对象分配一个长度为零的存储空间,String.Empty不会为对象分配存储空间,语文没学好,实在不理解这两句话有什么差别,长度为零不就是没空间么?这有区别么?求大神解释,网上看了不少也没有对这两句话的解释,复制粘贴就免了c#null存储 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ""分配了地址,长度为零。string.Empty也分配了地址,长度为零。区别在于string.Empty是静态只读的变量。 这要明白 对象的内存分布了。null就不说了,要说的是:"" 和 String.Empty 效果基本一样,1.string.Empty是静态变量,在程序加载时已经被加载到了加载堆中了,分配的是长度为0的一个地址。2.string s1=""; 和 string s2 = string.Empty;//基本是一样,s1会分配一个长度为0的空间,接着马上会放弃这个空间,而成为垃圾,因为字符串驻留,s1会指向string.Empty分配的空间,可以用string.ReferenceEquals(s1,s2) 查看引用,基本可以忽略这种性能。 个人认为string.Empty和""的区别就像"\"和Path.DirectorySeparatorChar的区别一样,因为某些平台的空字符串不是""而.NET是为了跨平台而生的. String是引用类型,任何引用类型的赋值都是传递的引用地址,因此你传递String.Empty就直接将其引用地址传递过去了,不需要初始化一个空的字符串,但是直接用""就需要一个字符串初始化过程,初始化了一个长度为0的引用对象。 string.Empty只是没有为字符串内容分配空间而已,不是没有为string对象分配空间, 本帖最后由 caozhy 于 2013-01-01 02:04:12 编辑 长度为零不表示内存里没放东西,这里就看出学c/c++的好了,学c/c++的人都知道的一个基础知识是“\0”是字符串结尾标志,也就是技术你里面木放东西,只要分配存储空间了,在内存上也会有一个“\0”标志存在 推荐使用Empty坚持为空使用string.IsNullOrEmpty()方法 null 压根没有 string 对象。 Empty 就是 "" ,有String对象,但里面内容是空,是个空盒子。 "" Empty1L很对 C#和C++完全不一样,不要拿C++的理解套用过来,C#里面字符串不是\0结束的,\0是可以作为字符串的一部分。居然这回答成为了得分答案,楼主也真实眼瞎了。 对此我不做评价,我只问一件事情,你认为clr,是怎么在连续分配的数据存储内存空间里判定一个字符串的呢。按博客园的那些号称string是特殊引用的人们的说法 string a="a";string b=a+"b";是两个个数据空间存储滴,那么在内存数据空间里,clr又是怎么判定 "a","ab"是两个字符串,而不是一个“aab”字符串呢?不管clr怎么包装他,字符串结尾标志都是一定存在的东西。因为道理很简单,如果clr是地址+size那么他可以不要结尾标志,但是clr是这么存储string滴吗?明显不是 不需要结束标志,字符串在.NET里面是特殊的引用类型,属于Class,情况一般的Class是如何封装的?Class都需要以\0结束吗? 怎么让datagridview用windows身份验证来连数据库? C# 如何动态的将符合要求的数据放入到列表中 Winform 怎样选取窗体上绘制的文本. C#里怎样获取pictureBox里显示图片的名称啊? getchildRows的问题 简单问题散分!~~!~!~! 如何启动一个可执行程序并同时打开一个文件 如果在编译过程中出现 error CS0103: 名称“i”在类或命名空间“Test”中不存在,该如何解决? C# WPF 中,下面的文本表格格式如何设置 祝CSDN上的程序员们新年快乐,2004年再见了! 管理路由器管理登陆的地址,是否这样都可以? C# 如何加载网络txt
1.string.Empty是静态变量,在程序加载时已经被加载到了加载堆中了,分配的是长度为0的一个地址。2.string s1=""; 和 string s2 = string.Empty;
//基本是一样,s1会分配一个长度为0的空间,接着马上会放弃这个空间,而成为垃圾,因为字符串驻留,s1会指向string.Empty分配的空间,可以用string.ReferenceEquals(s1,s2) 查看引用,基本可以忽略这种性能。
坚持为空使用string.IsNullOrEmpty()方法
Empty 就是 "" ,有String对象,但里面内容是空,是个空盒子。
Empty
1L很对
居然这回答成为了得分答案,楼主也真实眼瞎了。
对此我不做评价,我只问一件事情,你认为clr,是怎么在连续分配的数据存储内存空间里判定一个字符串的呢。按博客园的那些号称string是特殊引用的人们的说法 string a="a";
string b=a+"b";
是两个个数据空间存储滴,那么在内存数据空间里,clr又是怎么判定 "a","ab"是两个字符串,而不是一个“aab”字符串呢?不管clr怎么包装他,字符串结尾标志都是一定存在的东西。因为道理很简单,如果clr是地址+size那么他可以不要结尾标志,但是clr是这么存储string滴吗?明显不是