如何在C#和Javascript中处理字符串VS字符?

时间:2017-01-10 08:35:49

标签: c# string

在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

看起来字符串和字符作为单独的,可互换的类型处理,并且使用单引号或双引号划分了这个?

键入语言中字符和字符串之间的关系是什么?具体来说,说一个字符串是一个字符数组是否正确?

2 个答案:

答案 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)。