我只想确定一下:
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不必是阵列支持.
在本网站的其他地方 @JaredPar :
您创建的underyling字符串还需要一个连续的内存块,因为它表示为chars数组(数组需要连续的内存).
我相信你不应该依赖它,因为它不是接口的一部分,但如果这个语句是正确的,那么实现就是一个数组.鉴于我们对char-strings的了解以及Microsoft需要支持托管语言和本地语言之间的有效互操作,这对我来说是有意义的.
MSDN只说这个,这并不能保证存储是一个数组.
字符串是Unicode字符的顺序集合,用于表示文本.String对象是表示字符串的System.Char对象的顺序集合.字符串对象的值是顺序集合的内容,并且该值是不可变的(即,它是只读的).