C#中字符串的内部表示

时间:2010-09-24 14:02:45

标签: c# string char

我只想确定:

string x = "";   
char Char = x[0];  // throws exception: "Index was outside the bounds of the array"

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

6 个答案:

答案 0 :(得分:13)

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

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

  

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

此外,MSDN声明:

  

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

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

使用链表实现的字符串和在列表中向前移动n个空格的索引器就足以满足语言要求。 IList<char>也会满足要求,IList不必支持数组。

答案 1 :(得分:6)

Per @JaredPar elsewhere on this site

  

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

我确信您不应该依赖它,因为它不是接口的一部分,但如果此语句正确, implementation 是一个数组。鉴于我们对char字符串的了解以及Microsoft需要支持托管语言和本地语言之间的有效互操作,这对我来说很有意义。

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

  

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

答案 2 :(得分:1)

您可能会发现此MSDN doc有用。

简而言之,字符串“存储为Char对象的顺序只读集合”

而且,是的,它可以像char数组一样访问。因此,如果X包含String.Empty以外的值,那么char Char=X[0;]代码将返回字符串的第一个字符。

答案 3 :(得分:1)

据我所知,这是正确的。顺便说一下这是一个everything you ever wanted to know about Strings的页面:

答案 4 :(得分:1)

C#只是语言。 string关键字是.Net框架的BCL中System.String的别名。假设内部String是一个chars数组是非常安全的。来自MSDN:

字符串是Unicode字符的顺序集合,用于表示文本。 String对象是表示字符串的System.Char对象的顺序集合。

答案 5 :(得分:0)

这取决于你对“数组”的意思。

如果你的意思是随机访问,固定长度,整数可索引的对象集合的通用计算概念,那么是的,字符串可以被认为是那样的。 (通用计算概念通常包括在内存中连续,但除了少数情况,例如在不安全的代码中使用指针,这在C#方面没有多大意义。)

如果你的意思是这个概念的语言定义的C#实现,char[]那么不是真的,这两个是不同的东西。

在实践中,System.String确实是作为char的数组实现的,但它不一定是。

除了语言方面的挑剔,实际的一点:

如果你想对字符串执行与char[]上相同的操作,那么这通常会起作用(尽管字符串是只读的)并且通常是最有效的方法,只要在概念上相当简单。特别是,使用foreach并使用在0str.Length - 1之间移动的索引效果很好。同样,char[]可以在string上完成许多操作,例如CopyTo()并转换为IEnumerable<char>

如果您想要实际拥有一组字符,则需要调用ToCharArray()