c# 數(shù)據(jù)類型
在 c# 中,變量分為以下幾種類型:
- 值類型(value types)
- 引用類型(reference types)
- 指針類型(pointer types)
1. 值類型(value types)
值類型變量可以直接分配給一個(gè)值。它們是從類 system.valuetype 中派生的。
值類型直接包含數(shù)據(jù)。比如 int、char、float,它們分別存儲(chǔ)數(shù)字、字符、浮點(diǎn)數(shù)。當(dāng)您聲明一個(gè) int 類型時(shí),系統(tǒng)分配內(nèi)存來存儲(chǔ)值。
下表列出了 c# 2010 中可用的值類型:
類型 | 描述 | 范圍 | 默認(rèn)值 |
---|---|---|---|
bool | 布爾值 | true 或 false | false |
byte | 8 位無符號(hào)整數(shù) | 0 到 255 | 0 |
char | 16 位 unicode 字符 | u +0000 到 u +ffff | '\0' |
decimal | 128 位精確的十進(jìn)制值,28-29 有效位數(shù) | (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 | 0.0m |
double | 64 位雙精度浮點(diǎn)型 | (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 | 0.0d |
float | 32 位單精度浮點(diǎn)型 | -3.4 x 1038 到 + 3.4 x 1038 | 0.0f |
int | 32 位有符號(hào)整數(shù)類型 | -2,147,483,648 到 2,147,483,647 | 0 |
long | 64 位有符號(hào)整數(shù)類型 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0l |
sbyte | 8 位有符號(hào)整數(shù)類型 | -128 到 127 | 0 |
short | 16 位有符號(hào)整數(shù)類型 | -32,768 到 32,767 | 0 |
uint | 32 位無符號(hào)整數(shù)類型 | 0 到 4,294,967,295 | 0 |
ulong | 64 位無符號(hào)整數(shù)類型 | 0 到 18,446,744,073,709,551,615 | 0 |
ushort | 16 位無符號(hào)整數(shù)類型 | 0 到 65,535 | 0 |
如需得到一個(gè)類型或一個(gè)變量在特定平臺(tái)上的準(zhǔn)確尺寸,可以使用 sizeof 方法。表達(dá)式 sizeof(type) 產(chǎn)生以字節(jié)為單位存儲(chǔ)對(duì)象或類型的存儲(chǔ)尺寸。下面舉例獲取任何機(jī)器上 int 類型的存儲(chǔ)尺寸:
using system; namespace datatypeapplication { ? ?class program ? ?{ ? ? ? static void main(string[] args) ? ? ? { ? ? ? ? ?console.writeline("size of int: {0}", sizeof(int)); ? ? ? ? ?console.readline(); ? ? ? } ? ?} }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
size of int: 4
2. 引用類型(reference types)
引用類型不包含存儲(chǔ)在變量中的實(shí)際數(shù)據(jù),但它們包含對(duì)變量的引用。
換句話說,它們指的是一個(gè)內(nèi)存位置。使用多個(gè)變量時(shí),引用類型可以指向一個(gè)內(nèi)存位置。如果內(nèi)存位置的數(shù)據(jù)是由一個(gè)變量改變的,其他變量會(huì)自動(dòng)反映這種值的變化。內(nèi)置的 引用類型有:object、dynamic 和 string。
1) 對(duì)象(object)類型
對(duì)象(object)類型 是 c# 通用類型系統(tǒng)(common type system - cts)中所有數(shù)據(jù)類型的終極基類。object 是 system.object 類的別名。所以對(duì)象(object)類型可以被分配任何其他類型(值類型、引用類型、預(yù)定義類型或用戶自定義類型)的值。但是,在分配值之前,需要先進(jìn)行類型轉(zhuǎn)換。
當(dāng)一個(gè)值類型轉(zhuǎn)換為對(duì)象類型時(shí),則被稱為 裝箱;另一方面,當(dāng)一個(gè)對(duì)象類型轉(zhuǎn)換為值類型時(shí),則被稱為 拆箱。
object obj; obj = 100; // 這是裝箱
2) 動(dòng)態(tài)(dynamic)類型
您可以存儲(chǔ)任何類型的值在動(dòng)態(tài)數(shù)據(jù)類型變量中。這些變量的類型檢查是在運(yùn)行時(shí)發(fā)生的。
聲明動(dòng)態(tài)類型的語法:
dynamic <variable_name> = value;
例如:
dynamic d = 20;
動(dòng)態(tài)類型與對(duì)象類型相似,但是對(duì)象類型變量的類型檢查是在編譯時(shí)發(fā)生的,而動(dòng)態(tài)類型變量的類型檢查是在運(yùn)行時(shí)發(fā)生的。
3) 字符串(string)類型
字符串(string)類型 允許您給變量分配任何字符串值。字符串(string)類型是 system.string 類的別名。它是從對(duì)象(object)類型派生的。字符串(string)類型的值可以通過兩種形式進(jìn)行分配:引號(hào)和 @引號(hào)。
例如:
string str = "yapf.com";
一個(gè) @引號(hào)字符串:
@"yapf.com";
c# string 字符串的前面可以加 @(稱作"逐字字符串")將轉(zhuǎn)義字符(\)當(dāng)作普通字符對(duì)待,比如:
string str = @"c:\windows";
等價(jià)于:
string str = "c:\\windows";
@ 字符串中可以任意換行,換行符及縮進(jìn)空格都計(jì)算在字符串長度之內(nèi)。
string str = @"<script type=""text/javascript""> <!-- --> </script>";
用戶自定義引用類型有:class、interface 或 delegate。我們將在以后的章節(jié)中討論這些類型。
3. 指針類型(pointer types)
指針類型變量存儲(chǔ)另一種類型的內(nèi)存地址。c# 中的指針與 c 或 c++ 中的指針有相同的功能。
聲明指針類型的語法:
type* identifier;
例如:
char* cptr; int* iptr;
我們將在章節(jié)"不安全的代碼"中討論指針類型。