這一篇要講乙個非常重要的話題:char型別與string型別的區別。從字面上說,他們是有區別的
1. char是字元型別
2. string是字串型別
雖然一字之差,但其本質是很大的。
2. string是乙個模板型別,也就是乙個class(c++)。在c#中它屬於引用型別(reference type)。string的長度是無法明確取得的。也就是無法通過sizeof來取得,因為它不是乙個基礎型別,它本身並不固定長度,而取決於內部包含的字元。
說完了本質區別,我們再來看一下從使用者角度來看
1. char型別:用單引號,例如:『陳』,』a』
要表示多個字元怎麼辦?那麼就用char,也就是陣列2.string型別:用雙引號,例如:」我是陳希章」【注意】如果在c++中,將』陳』賦值給乙個char型別,而不是wchar_t型別,會有問題,因為漢字是兩個位元組的,char是乙個位元組的。
除此之外,還有一些很重要的區別
1. char型別雖然聽起來是字元型別,但其他它可以隱式地轉換為包括short, int,long等整數型別。為什麼這麼說呢?我們不是說了它要麼佔1個位元組,要麼佔2個位元組嗎?
下面來看乙個例子,如何對char轉換為short,以及如何從short轉換為char
這也就是我們經常說的,字元對應的編碼:大寫a編號為65,小寫a編號為97
相關知識:在excel中,可以通過char函式根據乙個數字返回字元,通過code函式返回某個字元對應的編碼,如下
=char(97) 會返回「a"2. char型別既然是乙個基礎型別,它有signed char和unsigned char的區分=char(98) 會返回「b"
=char(99) 會返回「c"
=char(100) 會返回「d"
以此類推。。。。。
反向返回
=code(「a") 會返回「97"
=code(「b") 會返回「98"
=code(「c") 會返回「99"
=code(「d") 會返回「100"
你可能會問,乙個字元跟符號有什麼關係呢?
沒錯,字元是沒有關係。但你要知道,char型別可以用來表示整數的。既然是可以用來表示整數,就有正負之分了。例如,我們要表示乙個整數,它的取值範圍比較小,不會超過255.那麼此時,我們就可以直接用unsigned char,而不必用short(2個位元組),更沒有必要用int(4個位元組)了
但是,到了c#裡面,所有的char都是無符號的
1、byte 變數以無符號的 8 位(1 個位元組)數字的形式儲存,取值範圍為 0 到 255。相關知識:sql server中類似整數型別的聯想byte 資料型別用於存放二進位制資料。
注意 byte 資料型別可以轉換為 short、integer、long、single、double 或 decimal 資料型別,而不會出現 system.overflowexception 錯誤。
2、char 變數以無符號的 16 位(2 個位元組)數字的形式儲存,取值範圍為 0 到 65535。每個數字代表乙個 unicode 字元。不能直接在 char 資料型別和數值型別之間進行轉換,但可以使用 ascw 和 chrw 函式來完成。
我又聯想到在sql server中幾個特殊的資料型別
bit取值:0,1
tinyint
取值:0~255。相當於c++中的unsigned char,或者c#中的byte
smallint
取值:-32768~32767。其實相當於c++中的short型別
int取值:正負20多億,也就是正負2的32次方
最後談一談,string這個型別到底是怎麼儲存資料的,它需要占用多少空間?
1. string中沒過字元都用2個位元組儲存
2. string的最後還有乙個特殊的字元,是不可見的,\0 。它也是佔兩個位元組
3. string的大小是不可以通過sizeof來獲得的。如果嘗試通過sizeof取得string的大小,會遇到編譯錯誤
上面的錯誤提示說,要用system.runtime裡面的乙個型別去做。不要這麼做,因為沒有用。請參考下面的**
using system;
using system.collections.generic;
using system.text;
string input = "你好,我是陳希章";
byte bytes = encoding.default.getbytes(input);
console.writeline(bytes.length);//返回15,每個漢字佔兩個位元組(7×2=14),標準的佔1個位元組
byte bytes2 = encoding.unicode.getbytes(input);
console.writeline(bytes2.length);//返回16,所有字元都用兩個位元組
byte bytes3 = encoding.ascii.getbytes(input);
console.writeline(bytes3.length);//返回8,所有字元都用乙個位元組(有點詭異)
console.read();}}
}也就是說,乙個字串具體占多大空間,還取決於字元的編碼。到了這裡,大家應該就有更好的認識了。最後說兩個與string 有關的技巧
1. c#中,string是不可變的。在動態構造字串的時候(例如:result=result+」test」 ),其實會產生乙個新的字串,原有的result還會保留,新建立的乙個的result是舊的result和「test」連起來的結果。所以,為了更好的使用資源,應該使用stringbuilder
2. string有沒有上限呢?理論上是受記憶體限制。但一般可以認為是2g(2的31次方)
另外,在使用char或者string的時候,不要忘記有一些字元是比較特殊的,也就是所謂的「轉義字元」,例如\n表示換行,\t表示tab鍵等
\b:回退:向後退一格
\f:換頁
\n:換行,游標到下行行首
\r:回車,游標到本行行首
\t:水平製表
\v:垂直製表
\\:反斜槓
\『:單引號
\":雙引號
\?:問號
\ddd:三位八進位制
\xhh:二位十六進製制
\0:空字元(null),什麼都不做。換行只是換一行,不改變游標的橫座標;回車只是回到行首,不改變游標的縱座標。
char型別和string型別的區別
也許有很多同學分不清這個char型別和string型別,區別到底在 一開始他們問我,差別在 我也不太說的清楚,貌似都是字串,貌似是字元,通過查閱資料,我對他們的區別有了進一步的了解。雖然一字之差,但是本質的區別很大。我們從c 與c 的角度來進行闡述一下。1.char是字元型別 屬於值型別 value...
string型別和char型別相互轉換
概念 string string可以被看成是以字元為元素的一種容器。具有一些成員函式比如begin end 迭代器可以根據他們進行定位,length 函式獲取長度。與char型別不同,string 不一定使用null 0 結束,不能將string直接賦值給char char char 是乙個指標,可...
將char型別轉換為string型別
將char型別轉換為string型別 string的建構函式中有此函式原型 string size t n,char c 因此我們可以直接使用此函式 string s 1,a 建立s並將1個a存入到s中 前面的數字代表多少個 擴充套件將char型別放入到vector容器中 第一種就是 vectorv...