在JavaScript中,单引号和双引号在某种程度上是可以互换的,并且在很大程度上是一种风格问题(这里有一个很好的讨论为什么实际情况并非如此:Making and restoring backups)。如何在C#中处理字符和字符串?
例如:
string test = "hello world";
string test2 = 'hello world'; // Too many characters in character literal
char test3 = 'a';
char test4 = "a"; // Cannot implicitly convert type string to char
看起来字符串和字符作为单独的,可互换的类型处理,并且使用单引号或双引号划分了这个?
键入语言中字符和字符串之间的关系是什么?具体来说,说一个字符串是一个字符数组是否正确?
答案 0 :(得分:5)
说一个字符串是一个字符数组
是否正确
在.NET中,字符串是一个对象,包含一个包含UTF-16代码单元的连续内存块。 char
是另一个(原始)数据类型,它只包含一个代码点,没有对象开销。
从interesting blog post from Jon Skeet开始,他比较了.NET与Java的实现:
长字符串由内存中的单个大对象组成。将其与Java进行比较,其中String在内存消耗方面是“普通”类型,包含char数组的偏移量和长度 - 因此长字符串由引用大型char数组的小对象组成。
答案 1 :(得分:2)
C#使用引号来表示类型 - '
始终为char
,"
始终为string
。
在.NET中,字符串的行为类似于char
的只读数组,因此:
// Treat string like an array
char c = "This is a string"[3];
int len = "This is a string".Length
// Now we have the char at pos 3
c == 's';
你不能做的就是编辑它们:
// This fails
"This is a string"[3] = 'x';
// This is fine, because we get a new editable char[]
char[] c = "This is a string".ToCharArray();
c[3] = 'x';
在任何.NET语言中都是如此,因为它们都使用相同的字符串实现。其他强类型框架有不同的处理字符串的方式。
在.NET中char
可以显式地转换为int
并隐式转换,所以:
char c = (char) 115; // 's'
int i = c; // 115
最后char
是一个值类型,而string
(作为封面下字符字节的集合)实际上是一个不可变的引用类型。这些在代码中表现非常相似,但在内存中以不同的方式存储 - 我认为这就是为什么C#区分它们的界限 - "s"
和's'
是不同的东西并以不同的方式存储(完全不同于Javascript string
)。