C#的數據類型可以分為3類:數值類型,引用類型,指針類型。指針類型僅在不安全代碼中使用。
值類型包括簡單類型(如字符型,浮點型和整數型等),集合類型和結構型。引用類型包括類類型,接口類型,代表類型和數組類型。
值類型和引用類型的不同之處是值類型的變量值直接包含數據,而引用類型的變量把它們的引用存儲在對象中。對於引用類型的變量,完全有可能讓兩個不同的變量引用同一個對象,這樣一來,對其中一個變量的操作就會影響到被另一個變量引用的對象。對於值類型的變量而言,每一個變量有它們自己的數值,因此對其中一個變量的操作不可能影響到另外一個變量。
1 值類型
所有的值類型都隱含地聲明了一個公共的無參數的構造函數,這個構造函數叫做默認構造函數。默認構造函數返回一個初始為零的值類型的實例,稱之為默認值。
對於sbyte,byte,short,ushort,int,uint,long,ulong,默認值為0。
對於char,默認值是'\x0000' ,對於float,默認值是0。0F 對於double,默認值是0。0D 對於decimal,默認值是0。0M 對於bool,默認值是false 對於一個枚舉類型,默認值是0 對於一個結構類型,默認值的設置就是把所有值類型的域都設置為它們各自的默認值,把所有的引用類型的域賦為空
1.1 簡單類型
C#提供一套預定義的結構類型叫做簡單類型。簡單類型用保留字定義,這些保留字僅僅是在System名字空間里預定義的結構類型的化名。比如int是保留字,System。Int32是在System名字空間中預定義類型。一個簡單類型和它化名的結構類型是完全一樣的,也就是說寫int和寫System。Int32是一樣的。簡單類型主要有整型,浮點類型,小數類型,布爾類型,字符型
1.1.1 整型
C#中支持9種整型:sbyte,byte,short,ushort,int,uint,long,ulong和char。
Sbyte:代表有符號的8位整數,數值范圍從-128 ~ 127
Byte:代表無符號的8位整數,數值范圍從0~255
Short:代表有符號的16位整數,范圍從-32768 ~ 32767
ushort:代表有符號的16位整數,范圍從0 到 65,535
Int:代表有符號的32位整數,范圍從-2147483648 ~ 2147483648
uint:代表無符號的32位整數,范圍從0 ~ 4294967295
Long:代表有符號的64位整數,范圍從-9223372036854775808 ~ 9223372036854775808
Ulong:代表無符號的64位整數,范圍從0 ~ 18446744073709551615。
char:代表無符號的16位整數,數值范圍從0~65535。 Char類型的可能值對應於統一字符編碼標准(Unicode)的字符集。
Char類型與其他整數類型相比有以下兩點不同之處: a,沒有其他類型到char類型的隱式轉換。即使是對於sbyte,byte和ushort這樣能完全使用char類型代表其值的類型, sbyte,byte和ushort到char的隱式轉換也不存在。 b,char類型的常量必須被寫為字符形式,如果用整數形式,則必須帶有類型轉換前綴。
比如(char)10賦值形式有三種: char chsomechar="A"; char chsomechar="\x0065"; 十六進制 char chsomechar="\u0065 ;
unicode表示法 字符型中有下列轉義符: 1,\'用來表示單引號 2,\"用來表示雙引號 3,\\ 用來表示反斜杠 4, \0 表示空字符 5, \a 用來表示感嘆號 6, \b 用來表示退格 7, \f 用來表示換頁 8, \n 用來表示換行 9, \r 用來表示回車 10, \t 用來表示水平tab 11, \v 用來表示垂直tab
1.1.2 浮點類型
C#支持兩種浮點類型:float和double。
Float型所能表示的值的范圍大約可以從1.5*10 -45~3.4* 10 38,精確到小數點后面7位。
Double型所能表示的值的范圍大約可以從5.0*10 -324~1.7* 10 308,精確到小數點后面15位或16位。 如果二元操作中的其中一個操作數為浮點類型,那么另外一個操作數是整型或浮點類型,運算規則如下: a,如果其中一個操作數是整型,則操作數被轉換為另一個操作數的浮點數類型; b,如果操作數之一為double,則另一操作數也被轉換成double類型,運算以double類型的精度和取值范圍進行,並且所得結果也為double類型; c,否則,運算至少將以float類型的取值范圍和精度進行,並且所得結果也為float型。
1.1.3 小數(decimal)類型
小數類型非常適用於金融和貨幣運算。數值范圍從1.0*10 -28~7.9* 10 28,精確到小數點后面28位。如果二元操作中的其中一個操作數是小數類型,那么另外一個從操作數是整型或小數類型。整型在運算前被轉化為小數類型數。如果一個小數類型的算術運算產生了一個對於小數類型的格式來說太小的值,操作的結果將會變成0。如果一個小數類型的算術運算產生了一個對於小數類型的格式來說太大的值,就會觸發溢出錯誤。小數類型較浮點類型而言,具有更大的精確度,但是數值范圍相對小了很多。將浮點類型的數向小數類型的數轉化時會產生溢出錯誤,將小數類型的數向浮點類型的數轉化時會造成精確度的損失。因此,兩種類型不存在隱式或顯式轉換。布爾型:值為true或false。沒有標准能實現布爾類型和其他類型的轉換。 1.2 枚舉類型 枚舉類型的元素使用的類型只能是long,int,short,byte。默認類型是int。默認第一個元素的值是0,每一個連續的元素按1遞增。可以給元素直接賦值。如:
2 引用類型
引用類型包括類類型,接口類型,代表類型和數組類型。
2.1 類類型 類 類型定義了一種數據結構,這個數據結構中包含了數據成員(如常量,字段和事件等),函數成員(如方法,屬性,索引,操作,構造函數和析構函數等)和嵌套 類型。支持繼承。 2.2 對象類型 對象類型是其他所有類型最終的基礎類型。在C#中每一種類型都直接或者間接的源於object這個類類型。
2.3 字符串類型 字符串類型是直接從object中繼承而來的密封類。String類型的值可以寫成字符串文字的形式。
2.4 接口類型 一個接口聲明一個只有抽象成員的引用類型,接口僅僅存在方法標志,但沒有執行代碼。當定義一個類時,如果類從接口派生,可以派生自多重接口;但是如果類從類派生,就只能從一個類派生。 聲明方法如例:
interface iface { void showmyface(); } interface iface { void showmyface(); }
2.5 代表類型
代表引用一種靜態的方法或者對象實例,引用該對象的實例方法。與其接近的是c/c++中的指針,但指針只能訪問靜態的函數,代表既能訪問靜態的方法,也能訪問實例的方法。
2.6 數組 數組是包含一串變量的數據結構。數組變量也稱做數組元素,它們具有相同的類型,這種類型也稱做數組元素類型。數組的元素類型可以是任何類型,包括數組類型。數組用下標確定每一個數組元素的索引號。只有一個下標的數組稱為一維數組,多於一個下標的數組稱為 多維數組。
例:int[] a={0,2,4,6,8}; 等價於int[] a=new int[] {0,2,4,6,8}; 也可以這樣初始化:a[0]=0; a[1]=2; a[2]=4; a[3]=6; a[4]=8;
int[] a; //int型的一維數組
int[,] a;int型的二維數組
int[,,] a; //int型的三維數組
int[] []a; //int型的數組的數組
int[][][]a; //int型的數組的數組的數組
數組的每個維數的長度不是數組類型的一部分,維數的長度是在數組創建語句中指定的,而不是在數組類型中 指定的,
例如: int[,,] a3=new int[10,20,30]; a3是是一個數組變量, int[,,] 沒有指定數組的長度,數組創建語句new int[10,20,30]才指定。
下面的例子創建一個數組的數組:
int[][] J=new int[3][];
J[0]=new int[] {1,2,3};
J[1]=new int[] {1,2,3,4,5,6};
J[2]=new int[] {1,2,3,4,5,6,7,8,9};