我只想确定:
string x = "";
char Char = x[0]; // throws exception: "Index was outside the bounds of the array"
这意味着该字符串实际上被视为一个字符数组,对吧? (至少在内部。)
答案 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
并使用在0
和str.Length - 1
之间移动的索引效果很好。同样,char[]
可以在string
上完成许多操作,例如CopyTo()
并转换为IEnumerable<char>
。
如果您想要实际拥有一组字符,则需要调用ToCharArray()
。