C#中字符串的内部表示

Pet*_*etr 5 c# string char

我只想确定一下:

string x = "";   
char Char = x[0];  // throws exception: "Index was outside the bounds of the array"
Run Code Online (Sandbox Code Playgroud)

这意味着该字符串实际上被视为一个字符数组,对吧?(至少在内部.)

Dav*_*fer 13

C#语言规范不保证字符串的内部表示.但是,它实现了索引运算符,以便为字符串中的每个字符提供char.

编辑:为了澄清,因为有几个人评论过,是的,CLR中System.String的内部表示是一个数组.但是,语言规范没有说明内部表示,所以这可能(但不太可能)改变.它说字符串必须作为一系列字符.关于语言规范中唯一的一点是在1.3节下:

C#中的字符和字符串处理使用Unicode编码.char类型表示UTF-16代码单元,字符串类型表示UTF-16代码单元序列.

此外,MSDN声明:

字符串是Unicode字符的顺序集合,用于表示文本.String对象是表示字符串的System.Char对象的顺序集合.字符串对象的值是顺序集合的内容,并且该值是不可变的(即,它是只读的).

所以在这种情况下,我们现在谈论的是CLR,而不是语言.System.String - 但是,即使在那里,他们也不保证数组,只保证顺序收集.

使用链表实现的字符串和n在列表中向前移动空格的索引器足以满足语言要求.IList<char>也将满足要求,而IList不必是阵列支持.

  • @Bear Monkey - 'sequential collection'与'array'不同.你应该收回你的downvote我认为. (7认同)
  • 它的数组是否不是问题 - 显然它是一个数组.问题是它是否*必须是一个数组,而且我在文档中的任何地方都没有看到任何说明. (2认同)

Ste*_*end 6

在本网站的其他地方 @JaredPar :

您创建的underyling字符串还需要一个连续的内存块,因为它表示为chars数组(数组需要连续的内存).

我相信你不应该依赖它,因为它不是接口的一部分,但如果这个语句是正确的,那么实现就是一个数组.鉴于我们对char-strings的了解以及Microsoft需要支持托管语言和本地语言之间的有效互操作,这对我来说是有意义的.

MSDN只说这个,这并不能保证存储是一个数组.

字符串是Unicode字符的顺序集合,用于表示文本.String对象是表示字符串的System.Char对象的顺序集合.字符串对象的值是顺序集合的内容,并且该值是不可变的(即,它是只读的).