在體驗C#的銳利之前,關乎語言基本知識的掌握是必不可少的一環。由於C#基本語言很多源自C/C++,在這裡對那些和C/C++類似的地方僅作簡單介紹,我們將體驗專注於那些區別於傳統C/C++的關鍵的語言基礎知識。
數據類型
C#語言的數據類型主要分為兩類:值類型和引用類型。另外一種數據類型"指針"是為unsafe上下文編程專門設定的,其中unsafe上下文指對代碼進行unsafe標示以滿足利用指針對內存直接進行操作要求的C#非托管代碼,這些代碼將失去Microsoft.NET平台的垃圾收集等CLR性質,我們放在"COM互操作 非托管編程與異常處理"專題裡闡述。值類型的變量本身包含他們的數據,而引用類型的變量包含的是指向包含數據的內存塊的引用或者叫句柄。從下面這幅圖中可以清晰地看出兩者的差別:
引用類型帶來的可能的問題便是當多個變量引用同樣的內存塊時,對任何一個引用變量的修改都會導致該對象的值的改變。null值表示引用類型沒有對任何實際地址進行引用。
值類型可分為結構類型和枚舉類型。結構類型包括簡單類型和用戶自定義結構類型。枚舉類型和用戶自定義結構類型我們將在"第九講 結構,枚舉,數組與字符串"專題裡詳細闡述。簡單類型又可分為布爾類型和數值類型。C#語言中布爾類型嚴格與數值類型區分,只有true和false兩種取值,不存在像C/C++裡那樣和其他類型之間的轉換。數值類型包括整值,浮點和decimal三種類型。整值類型有sbyte,byte,short,ushort,int,uint,long,ulong,char共九種。除了char類型外,其他8種兩兩一組分別為有符號和無符號兩種。浮點值有float和double兩種。decimal主要用於金融,貨幣等對精度要求比較高的計算環境。下表是對這些簡單類型的一個詳細的描述:
簡單類型
描 述
示 例
sbyte 8-bit 有符號整數 sbyte val = 12; short 16-bit 有符號整數 short val = 12; int 32-bit有符號整數 int val = 12; long 64-bit有符號整數 long val1 = 12; long val2 = 34L; byte 8-bit無符號整數 byte val1 = 12; byte val2 = 34U; ushort 16-bit 無符號整數 ushort val1 = 12; ushort val2 = 34U; uint 32-bit 無符號整數 uint val1 = 12; uint val2 = 34U; ulong 64-bit 無符號整數 ulong val1 = 12; ulong val2 = 34U; ulong val3 = 56L; ulong val4 = 78UL; float 32-bit單精度浮點數 float val = 1.23F; double 64-bit雙精度浮點數 double val1 = 1.23; double val2 = 4.56D; l 布爾類型 bool val1 = true; bool val2 = false; char 字符類型 ,Unicode 編碼 char val = 'h'; decimal 28個有效數字的128-bit十進制類型 decimal val = 1.23M;引用類型共分四種類型:類,接口,數組,委派。類除了我們可以定義自己的類型外,又包括兩個比較特殊的類型object和string。object是C#中所有類型(包括所有的值類型和引用類型)的繼承的根類。string類型是一個密封類型(不能被繼承),其實例表示Unicode字符串,它和數組類型我們將放在"第九講 結構,枚舉,數組與字符串"中詳述。接口類型定義一個方法的合同,我們將在"第七講 接口 繼承與多態"中講述。委派類型是一個指向靜態或實例方法的簽名,類似於C/C++中的函數指針,將在"第八講 委派與事件"中講述。實際上我們將從後面的專題中看到這些類型都是類的某種形式的包裝。
每種數據類型都有對應的缺省值。數值類型的缺省值為0或0.0,其中char的缺省為'\x0000'。布爾類型的缺省值為false。枚舉類型的缺省值為0。結構類型的缺省值是將它所有的值類型的域設置為對應值類型的缺省值,將其引用類型的域設置為null。所有引用類型的缺省值為null。