本人小白一枚,刚学C#不久,问题如题,都说""会为对象分配一个长度为零的存储空间,String.Empty不会为对象分配存储空间,语文没学好,实在不理解这两句话有什么差别,长度为零不就是没空间么?这有区别么?求大神解释,网上看了不少也没有对这两句话的解释,复制粘贴就免了c#null存储

解决方案 »

  1.   

    ""分配了地址,长度为零。string.Empty也分配了地址,长度为零。区别在于string.Empty是静态只读的变量。
      

  2.   

    这要明白 对象的内存分布了。null就不说了,要说的是:"" 和 String.Empty 效果基本一样,
    1.string.Empty是静态变量,在程序加载时已经被加载到了加载堆中了,分配的是长度为0的一个地址。2.string s1=""; 和 string s2 = string.Empty;
    //基本是一样,s1会分配一个长度为0的空间,接着马上会放弃这个空间,而成为垃圾,因为字符串驻留,s1会指向string.Empty分配的空间,可以用string.ReferenceEquals(s1,s2) 查看引用,基本可以忽略这种性能。
      

  3.   

    个人认为string.Empty和""的区别就像"\"和Path.DirectorySeparatorChar的区别一样,因为某些平台的空字符串不是""而.NET是为了跨平台而生的.
      

  4.   

    String是引用类型,任何引用类型的赋值都是传递的引用地址,因此你传递String.Empty就直接将其引用地址传递过去了,不需要初始化一个空的字符串,但是直接用""就需要一个字符串初始化过程,初始化了一个长度为0的引用对象。
      

  5.   

    string.Empty只是没有为字符串内容分配空间而已,不是没有为string对象分配空间,
      

  6.   

    本帖最后由 caozhy 于 2013-01-01 02:04:12 编辑
      

  7.   

    长度为零不表示内存里没放东西,这里就看出学c/c++的好了,学c/c++的人都知道的一个基础知识是“\0”是字符串结尾标志,也就是技术你里面木放东西,只要分配存储空间了,在内存上也会有一个“\0”标志存在
      

  8.   

    推荐使用Empty
    坚持为空使用string.IsNullOrEmpty()方法
      

  9.   

    null 压根没有 string 对象。 
    Empty 就是 "" ,有String对象,但里面内容是空,是个空盒子。
      

  10.   

      "" 
     Empty
    1L很对
      

  11.   

    C#和C++完全不一样,不要拿C++的理解套用过来,C#里面字符串不是\0结束的,\0是可以作为字符串的一部分。
    居然这回答成为了得分答案,楼主也真实眼瞎了。
      

  12.   


    对此我不做评价,我只问一件事情,你认为clr,是怎么在连续分配的数据存储内存空间里判定一个字符串的呢。按博客园的那些号称string是特殊引用的人们的说法 string a="a";
    string b=a+"b";
    是两个个数据空间存储滴,那么在内存数据空间里,clr又是怎么判定 "a","ab"是两个字符串,而不是一个“aab”字符串呢?不管clr怎么包装他,字符串结尾标志都是一定存在的东西。因为道理很简单,如果clr是地址+size那么他可以不要结尾标志,但是clr是这么存储string滴吗?明显不是
      

  13.   

    不需要结束标志,字符串在.NET里面是特殊的引用类型,属于Class,情况一般的Class是如何封装的?Class都需要以\0结束吗?