- ASP.NET程序設計教程(第2版)
- 崔連和主編
- 2467字
- 2020-09-18 18:22:47
3.2 C#語言的數據類型
C#有15種數據類型,這15種數據類型分為兩大類:值類型和引用類型。值類型可以簡單地理解為基本的數據類型,引用類型可理解為延伸的數據類型。值類型和引用類型的區別在于:值類型的變量直接存放實際的數據,而引用類型的變量存放的是數據的地址,即對象的引用。更通俗地說,值類型存放的是數據本身,而引用類型存放的是數據所處的位置說明。
3.2.1 值類型
值類型包括簡單值類型和復合類型。簡單值類型可以再細分為整數類型、字符類型、實數類型和布爾類型;復合類型則是簡單類型的復合,包括結構(struct)類型和枚舉(enum)類型。
1.整數類型
整數類型是最基本的數據類型,C#中共有8種整數類型,它們的區別在于表示數的范圍、所占的存儲空間的大小以及是否有符號位。8種整數類型如表3-2所示。
表3-2 整數類型

2.字符類型
字符(char)類型對應于.NET類庫中的System.Char結構。C#中采用Unicode字符集來表示字符類型,所以單個漢字也可作為字符。例如:

一個Unicode的標準字符長度是16位,所以char類型在計算機中占兩個字節。嚴格來說,字符類型也是一種特殊的整數類型,其取值范圍與Unshort相同。C#與C語言不同的是,不能把整數直接賦值給char類型的變量,只能顯式地將整數轉換為char類型再賦值給char類型的變量。例如C語言中:

但是在C#中這是不允許的,即不允許從其他類型到char類型的隱式轉換,必須進行顯式轉換,例如:

同C/C++一樣,C#中也存在一些特殊字符,通過“\”加其他字符表示這些特殊字符,稱為轉義符。C#中的轉義字符如表3-3所示。
表3-3 轉義字符

3.實數類型
實數類型分為浮點類型float、double和小數類型decimal三種類型。它們的區別主要在于取值范圍和精度的不同。其中,double類型的取值范圍最廣,decimal類型的精度最高。實數類型如表3-4所示。
表3-4 實數類型

雖然decimal類型精確度較高,但是取值范圍較小。因此,從浮點類型向小數類型轉換可能產生溢出異常,反之,可能出現精度損失。所以浮點類型和小數類型之間不存在隱式轉換,必須使用強制類型轉換。
注:decimal類型主要用于金融貨幣方面的計算。在直接書寫decimal類型的變量時,必須在數值后面添加m或M,例如,decimal num=1.24m,否則編譯會出錯。
4.布爾(bool)類型
bool類型對應于.NET類庫中的System.Boolean結構。它在計算機中占4個字節,即32位存儲空間。C#與C語言在布爾類型的取值上完全不同。C語言用值“0”表示假,而任何非零值均取值“1”。而C#中布爾類型取值只能是true或者false。bool類型的變量不能與其他類型的變量相互轉換。
5.結構類型
編程過程中經常會遇到需要將一系列不同數據類型的信息放在一起的情況,例如,學生表里包含學號、年齡和家庭住址等,這個時候就需要一種新的類型——結構類型,它可以把這些不同數據類型的信息組織成一個整體。結構中的數據類型沒有限制,可以是簡單值類型,也可以是結構類型或者是枚舉類型。結構類型采用struct關鍵字來進行聲明。
【操作實例3-2】 編寫一個簡單的結構體嵌套代碼,代碼如表3-5所示。
表3-5 結構類型舉例

6.枚舉類型
枚舉實際上是為一組邏輯上密不可分的整數值創建一系列的別名。使用關鍵字enum來定義。
【操作實例3-3】 定義枚舉Weekday,其內容為一周七天的英文名稱,代碼如表3-6所示。
表3-6 枚舉類型舉例

枚舉類型要求其成員只能是整數類型。默認地,枚舉中的每個元素的類型都是int型,且第一個元素的值為0,它后面的每一個元素的值依次加1。例如,表3-6中的程序,Sunday=0,Wednesday=3。也可以給枚舉中的元素直接賦值,如把Sunday的值設為1,Monday的值設為3,其后元素的值分別為4,5……依次遞增。枚舉類型的變量在某一時刻只能取枚舉類型中的某個元素。例如,表3-6定義的枚舉變量w1,它的值要么是Sunday,要么是其他的星期元素,在同一時刻只能取一個值,且該值只能是枚舉類型中的元素。
每個枚舉類型都有一個基礎類型,其基礎類型可以是除char以外的任何整型,默認的基礎類型為int,定義枚舉類型時,可選擇基礎類型。定義基礎類型的格式如下。
enum枚舉類型名[:基類型]{由逗號分隔的枚舉類型標示符}
注意,枚舉類型中元素的值不能超過基礎類型的取值范圍。
例如,表3-7代碼就是錯誤的。
表3-7 定義枚舉基礎類型錯誤代碼

3.2.2 引用類型
引用類型變量不直接存儲所包含的值,而是存儲值的地址。引用類型包括類(class)、接口(interface)、代理(delegate)和數組(array)四種類型。
1.類(class)
類是一組具有相同數據結構和相同操作的對象集合。創建類的實例必須使用關鍵字new來進行聲明。類和結構之間的根本區別在于:結構是值類型,而類是引用類型。對于值類型,每個變量直接包含自身的所有數據,每創建一個變量,就在內存中開辟一塊區域;而對于引用類型,每個變量只存儲對目標存儲數據的引用,每創建一個變量,就增加一個指向目標數據的指針。C#中最常用的類有object和string兩個。下面給出一個簡單的類的實例。值得說明的是,“類”是面向對象編程中非常重要的概念,也是C#語言編程的重要基礎。在本章后面的內容中,將有專門的篇幅重點說明“類”的概念。
【操作實例3-4】 編寫一個簡單的類,程序代碼如表3-8所示。
表3-8 類的定義舉例

2.接口(interface)
應用程序之間要相互調用,就必須事先達成一個協議,被調用的一方在協議中對自己所能提供的服務進行描述。在C#中,這個協議就是接口。接口定義中對方法的聲明,既不包括訪問限制修飾符,也不包括方法的執行代碼。如果某個類繼承了一個接口,那么它就要實現該接口所定義的服務,也就是實現接口中的方法。其定義如表3-9所示。
【操作實例3-5】 編寫一個簡單的接口。
表3-9 接口的定義舉例

3.代理(或委托)(delegate)
代理即指代,就是定義一種變量來指代一個函數或者一個方法,其使用過程分為以下三個步驟。
1)定義:delegate void MyDelegate();
2)實例化:MyDelegate hd=new MyDelegate(p1.Say);
3)調用:hd();
4.數組(array)
C#語言中的數組與C語言中數組的概念和用法相同。主要用于同一數據類型的數據進行批量處理。與C語言相同,C#的數組也要初始化之后才能使用。數組的具體使用方法見3.4節。
3.2.3 裝箱和拆箱
C#語言編程時經常需要將值類型和引用類型進行相互轉換。在C#中這種轉換操作用裝箱和拆箱來實現。
裝箱就是將值類型轉換為對象類型,其本質就是創建一個對象,并將值賦給該對象。拆箱就是將對象類型轉換為值類型,即將值從對象中復制出來,裝箱與拆箱實例如表3-10所示。
表3-10 裝箱與拆箱實例
