2017-01-10 40 views
2

在JavaScript中,單引號和雙引號有些可以互換,主要是樣式問題(有一個很好的討論,爲什麼在這裏的答案其實不是這種情況:When to use double or single quotes in JavaScript?)。如何在C#中處理字符和字符串?如何在C#和Javascript中處理字符串VS字符?

例如:

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

絕對,字符串是字符數組。 –

+1

即使「無類型」語言也可能會以不同的方式處理字符串和字符,特別是在處理Unicode時。你不能很好地要求整個字符串的Unicode範圍。而且,每種語言處理字符串都不同於其他字符。 –

+2

字符串不僅僅是字符數組。它們是不可變的,這意味着你不能修改它們,就像它們只是一個字符數組一樣。這允許運行時* intern *他們並使用一個字符串的單個實例,而不是創建副本。 –

回答

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

+1

@PatrickHofman澄清 – Keith

+0

@TimSchmelter它不是'Collection '或類似的東西 - 索引器不會包裝嵌套的'Array',並且在內部它只是字節。我認爲索引器只是複製相關的一對字節。 – Keith

5

會是正確地說,一個字符串是字符數組

在.NET中,一個字符串是含有含UTF-16代碼單元存儲器中的連續塊的對象。 A char是另一種(原始)數據類型,它只包含一個代碼點,沒有對象開銷。

從這個interesting blog post from Jon Skeet,在那裏他將.NET比較與Java實現:

長字符串由內存中的單大對象。將它與Java進行比較,在內存消耗方面,String是一個「常規」類型,它包含一個字符數組的偏移量和長度 - 所以一個長字符串由一個引用大型字符數組的小對象組成。

+0

值得注意的是,您可以_treat_即使在.NET中也是一個類似char []的字符串,它有一個[indexer](https://msdn.microsoft.com/en-us/library/system.string.chars(v = vs.110).aspx)您可以使用它來訪問給定索引處的字符。 –

+1

確實。它模仿的非常好,這就是爲什麼人們經常認爲它是一系列字符。 –

+0

@TimSchmelter它是,因此我的答案在下面。 – Keith