根據在內存中存儲位置的不同,C#的數據類型分為兩種
1.值類型:該類型的數據長度固定,存放於堆棧(stack)上。
2.引用類型:該類型的數據長度可變,存放於堆(Heap)上。
一. C#的值類型
類 別 | 說 明 |
簡單類型 | 有有符號整型,無符號整型,Unicode字符型,實數型,布爾型 |
枚舉類型 | enum E{...}形式的用戶定義類型 |
結構類型 | struct S{...}形式的用戶定義類型 |
可控類型 | 具有null值的值類型擴展,如int? 表示可為null的int類型 |
下面介紹每種值類型的特點
1.簡單類型
簡單類型是C#預置的數據類型,具有如下特性:首先,他們都是 .NET系統類型的別名;其次,由簡單類型組成的常量表達式僅在編譯時而不是運行時受檢測;最后,簡單類型可以直接被初始化。
(1)整數類型
數學上的整數可以從負無窮到正無窮,但是計算機的存儲單位是有限的,所以計算機語言提供的整數類型的值總是一定范圍之內的。C#有八種數據類型:短字節型(sbyte),字節型(byte),短整型(stort),無符號短整型(ustort),整型(int),無符號整型(unit),長整型(long),無符號長整型(ulong)。
(2)字符類型
除了數字,計算機處理的信息還包括字符。字符主要包括數字字符,英文字符,表達式字符等,C#提供的字符類按照國際上公認的標准,采用Unicode字符集。字符型書數據占用兩個字節的內存,可以用來存儲Unicode字符集當中的一個字符(注意,只是一個字符,不是一個字符串)。
(3)實數類型
C#有三種實數類型:float(單精度型),doudle(雙精度型),decimal(十進制小數型)。
(4)布爾類型
布爾類型是用來表示“真”和“假”兩個概念的,在C#里用true和false來表示。
2. 枚舉類型
枚舉(enum)實際上是為一組在邏輯上密不可分的整數值提供便於記憶的符號。
例如:定義顏色的枚舉,一年四季的枚舉
3.結構類型
利用簡單數據類型,可以進行一些常規數據運算,文字處理。但是在日常生活中,經常會碰到一些更復雜的數據類型,比如學生學籍記錄中可以包含學生姓名,年齡,籍貫,科家庭住址等信息。如果要用簡單類型來管理的話,每一條記錄都要放到三個不同的變量當中,工作量大,還不夠直觀。
所以C#就定義了一種數據類型,它將一系列相關的變量組織為一個實體,該類型稱為結構(struct),每個變量成為結構的成員。
4.可空類型
可空(Nullable)類型也是值類型,只是它是包含null的值類型。簡而言之,可控類型可以表示所有基礎類型的值加上null。因此聲明一個可空的布爾類型變量(System.Boolean),就可以從集合{true,false,null}中進行賦值。
為了定義一個可空的變量類型,在底層數據類型中添加問號(?)最為后綴。在C#中,System.Nullable<T>類型提供了一組所有可空類型都可以使用的成員,?后綴記法實際上是創建一個泛型System.Nullable<T>結構類型實例的簡寫。一非空變量一樣,局部可控變量必須賦一個初始值。
例如: int ? nullableInt =1;
double ? nullableDouble = 5.67;
這樣的語法只對值類型是合法的。如果視圖創建一個可空引用類型(包括字符串),就會遇到編譯時錯誤。
例如: string ? s = "string";
二. C#引用類型
類 別 | 說 明 |
類類型 |
Object,string,自定義類型 |
接口類型 |
Interface I {...}形式的用戶定義類型 |
數組類型 |
一維和多維數組 |
委托類型 |
Delegate int D {...}形式的用戶定義類型 |
下面介紹每種值類型的特點
1. 類類型
類是面向對象編程的基本單位,是對一組同類對象的抽象描述。類是一種包含數據成員,函數成員,和嵌套類型的數據結構。類的數據成員包括常量,域和事件,函數成員包括方法,屬性,索引指示器,運算器,構造函數和析構函數。
類和結構都包含了自己的成員,但他們之間最主要的區別在於:類是引用類型,而結構是值類型。另外類支持繼承機制而結構不支持。通過繼承,派生類可以擴展基類的數據成員和函數方法,進而達到代碼的重用和設計重用的目的。因此類一般用於定義復雜實體,結構主要用於定義小型數據結構。
(1)Obiect類型
在C#的統一系統中,所有類型(預定義類型,用戶定義類型,引用類型和值類型)都是直接或間接從類System.Object繼承的。
由於Object類型是所有其他類型的基類,可以將任何類型的賦給Object類型的變量。
(2)String類型
C#定義了一個基本的類string,專門用於對字符串的操作。.NET對string類型變量提供了獨特的管理方式,與別的引用類型不同,不需要使用new關鍵字就能聲明string類型的變量,因此string類型被看成是一個“獨特”的引用類型
(3)用戶自定義類型
C#程序員除了使用.NET Framework類庫中系統自定義類以外,還可以使用class關鍵字自定義類型。
2.接口類型
C#不支持類的多重繼承(指一個1子類可以有一個以上的直接父類,該子類可以繼承他直接的父類成員),但是客觀世界出現多重繼承的情況又比較多。為了避免傳統的多重繼承給程序帶來的復雜性等問題,C#提出了接口的概 念,通過接口可以實現多重繼承的功能。
接口在語法上和抽象類(Abstract Class)相似,它定義了若干個抽象方法,屬性,索引,事件,形成一個抽象成員的集合,每個成員通常反應事物嗎某方面的功能。
程序中接口的用處主要體現在下面幾個方面:
* 通過接口可以實現不相關類的相同行為,而不需要考慮這些類之間的層次關系。
* 通過接口可以指明多個類需要實現的方法。
* 通過接口可以了解對象的交互界面,而不需要了解對象所對應的類。
定義接口使用interface關鍵字,在接口中可以有0至多個成員。一個接口必須是抽象的方法,屬性,事件或索引,這些抽象成員都沒有實現體,並且所有接口成員隱含的都是公共訪問性。
一個接口不能包含常數,域,操作符,構造函數,靜態構造函數或嵌套類型,也不能包括任何類型的靜態成員。接口本身可以帶修飾符,如public,internal,但是接口成員聲明中不能使用除new外的任何修飾符。
按照編碼慣例,接口的名字都以大寫字母I開始。
接口把方法的定義和對它的實現區分開來,一個類可以實現多個接口來達到類似於“多重繼承”的目的。接口的繼承關系用冒號(:)表示,如果有多個基接口,則用逗號分開。
3.數組類型
數組(Array)是一種常用的引用數據類型,從字面上理解數組的概念,可以解釋為“一組數”,“一組元素”,數組中的元素是通過下標索引來進行訪問或修改。不同的下標表示數組中不同的元素,配合 數組的名字就可以訪問數組中的所有元素。
數組的下表是從零開始的,數組的長度定義為數組中包含元素的個數。
數組中的”秩“也稱數組的維數,用來確定和每個數組元素關聯的索引個數,數組最多可以有32個維數。“秩”為1的數組成為一維數組。“秩”大於1的數組成為多維數組。
4.委托類型
委托是用來處理其他語言(如C++,Pascal和Modula)需要用函數指針來處理的情況的。不過去C++函數指針不同,委托是完全面向對象的和類型安全的。
委托聲明定義一個從System.Delegate類派生的類,在聲明委托類型時,只需要指定委托指向的原型的類型,它不能有返回值,也不能帶有輸出類型的參數
委托實例封裝了一個調用列表,該列表列出了一個或多個方法,每個方法都稱為一個可調用體,對於實例方法,可調用實體有該方法和一個相關連的實例組成。對於靜態方法,可調用實體僅由一個方法組成。用一個適當的參 數集來調用一個委托實例,就是用此給定的參數集來調用該委托類型實例的每個科調用實體。