日期:2014-05-17  浏览次数:21286 次

关于C#的字符串存储
  Pascal把字符串存储为一个内存字符数组,其中,该数组的第一个元素指示字符串的长度;而C把字符串存储为一个具有可变长度的字符内存数组,字符串的末端加上一个ASCII null字符(在C中以"\0"表示)。

然后我们来看下C# 中的字符串监控图, 内存1 为str[0]  内存2 为str[1] 内存3 为str[2]
我发觉字符串中每个字符后面还有个null(ascii 值为0)

有哪位大神能告诉我,C#是怎么存储字符串的
知道java的讲java字符串存储方式也行
c# java 字符串 null 存储

------解决方案--------------------
具体没有仔细研究过,但从这个内存显示中很明显可以看出(也和我预想的一样),C#作为一种比较讲究类型安全和边界检查的语言来说,它的运行时对字符串也做了和传统的本地编译语言不同的处理,看每个字符串前有4个字节,这是一个little endian的字符串长度标识(比如333那个就是03 00 00 00,就是整数3,有了这个至于字符串末尾是否一定还要加0也不太清楚,但估计还是规定的)。然后由于C#中都是引用大部分都在堆上,所以应该这之前还有运行时相关信息(比如引用计数之类)而C#的引用就应该指到这块区域上,具体不清楚,在这里也看不出来,但从原理上讲就应该是这些东西。

------解决方案--------------------
还有这里也显然看出C#的字符串默认是wchar形式(unicode),一个字符占2个字节。
------解决方案--------------------
C#的字符串都是Unicode的编码,也不可能以\0结束,你也看到了,Unicode编码到处可以看到\0,因此再考虑\0结束是不可靠的了。