C# 入門指南
單元 3 - 實值型態與參考
C# 中的資料型態 (data type) 分成兩大類型,實值型態 (value type) 與參考 (reference)
使用變數 (variable) 前要先宣告 (declaration) ,例如以下宣告實值型態 int
int a;
int 是數種整數 (integer) 型態之一,之後可以直接用等號與整數的字面常數 (literal) 直接指派數值,例如
a = 0;
關鍵字 (keyword) int 同時也是內建型態名稱 System.Int32 的別名,因為很常用,所以被 C# 直接設定成關鍵字,其他除了列舉 (enumeration) 、結構 (structure) 外的十二種實值型態也是相同情況。
也可以宣告的時候直接指派,例如
int b = 0;
以上寫法等於用關鍵字 new 建立,例如
int c = new int();
上面的變數 c 也會是整數 0 。
整數屬於實值型態中的一種,下表為 C# 中的所有整數型態
類型 | 關鍵字 | 位元數 | 範圍 |
---|---|---|---|
整數 | sbyte | 8 | -128 到 127 |
整數 | byte | 8 | 0 到 255 |
整數 | short | 16 | -32,768 到 32,767 |
整數 | ushort | 16 | 0 到 65,535 |
整數 | int | 32 | -2,147,483,648 到 2,147,483,647 |
整數 | uint | 32 | 0 到 4,294,967,295 |
整數 | long | 64 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
整數 | ulong | 64 | 0 到 18,446,744,073,709,551,615 |
整數就是不帶小數點的數字,為什麼整數有這麼多種呢?這要從處理器的字長 (word length) 講起,字長是處理器一次可以處理的位元數,現在處理器字長常見的有 16 位元、 32 位元及 64 位元,主流桌上型電腦的處理器就是 64 位元,之所以處理器要分不同字長的原因,這是因為不同需求的處理器處理的工作事項不同,所以就有了不同字長的架構。
若是針對特定字長的處理器進行程式開發,直接使用符合該字長的的整數型態或是在不需要大整數的情況下,使用範圍較小的整數型態,理論上可以開發出更有效率的程式,倒是就一般桌上型電腦而言,使用 32 位元的 int 就可以應付大多數的情況,同時不失效率。
int 預設是最常用的整數型態,現在桌上型電腦的主流 CPU 為 64 位元,作業系統應用程式方面也從 32 位元過渡到 64 位元,如果將來慢慢改成 128 位元之後, int 或許會隨之調整為 64 位元或 128 位元。
浮點數 (floating-point number) 有以下三種
類型 | 關鍵字 | 位元數 | 範圍 |
---|---|---|---|
浮點數 | float | 32 | ±1.5 x 10−45 到 ±3.4 x 1038 |
浮點數 | double | 64 | ±5.0 × 10−324 到 ±1.7 × 10308 |
浮點數 | decmial | 128 | ±1.0 x 10-28 到 ±7.9228 x 1028 |
浮點數的字面常數為帶小數點的數字,例如
double d = 1.0;
浮點數分成三種,且分別佔據三種不同的位元字長是因為可以計算的範圍不同,一般而言 double 會比 float 來得範圍更大而且更精確,至於 decmial 到 128 位元,可計算範圍卻更小,這是因為 decimal 的精確度更高,官方推薦 decimal 可作金融方面的數據計算。
整數是不帶小數點的數字,同時整數是明確的,因此電腦中可以直接儲存整數,帶小數點的浮點數卻不一樣,因為小數點的概念有點抽象,現在的電腦並沒有能精確儲存小數點的硬體,或者說,造價太高,現在電腦中的浮點數是利用整數模擬計算出來的,因此浮點數有準確度的問題。
字元 (character) 型態只有一種,如下表
類型 | 關鍵字 | 位元數 | 範圍 |
---|---|---|---|
字元 | char | U+0000 到 U+FFFF |
C# 字元型態採用單引號為字面常數,單引號內可以是任何的 Unicode 字元
char e = '丟';
由於 Unicode 編碼本身都帶有一個編碼數字,因此字元可以自動轉換成數字,例如
int f = e;
這樣變數 f 會得到整數 19999 。
布林 (boolean) 型態如下表
類型 | 關鍵字 | 位元數 | 範圍 |
---|---|---|---|
布林 | bool | true 或 false |
布林型態的字面常數就是關鍵字 true 或 false ,例如
bool g = true;
這樣變數 g 就會是 true 。
另外還有兩種實值型態,分別是列舉與結構,如下表
類型 | 關鍵字 | 位元數 | 範圍 |
---|---|---|---|
列舉 | enum | 須自行定義 | |
結構 | struct | 須自行定義 |
列舉屬於簡易的整數數列,使用關鍵字 enum 宣告,例如
enum Day : byte {Sun=1, Mon, Tue, Wed, Thu, Fri, Sat};
以上列舉 Day 裡面的整數為 byte 型態,程式中的 Sun 表示整數 1 , Mon 表示整數 2 ,以此類推。
結構則是簡化的類別 (class) ,使用關鍵字 struct 宣告,例如
public struct Point
{
public int x, y;
public Point(int p1, int p2)
{
x = p1;
y = p2;
}
}
這樣 Point 結構的變數就帶有兩個欄位 (field) ,分別是 x 及 y ,定義時同樣要用關鍵字 new ,如下
Point p = new Point(10, 20);
列舉與結構的詳細定義與使用,請參考單元 9 - 列舉與結構。
結構就是定義簡單的物件 (object) ,更複雜的物件都應該要由類別來定義,使用關鍵字 class 定義的類別而建立的變數屬於參考,除了類別之外,使用關鍵字 delegate 、 dynamic 、 interface 、 object 、 string 宣告的項目也都屬於參考。
之後的單元會介紹如何使用這些關鍵字。
實務上定義類別很複雜,包括需要學習物件導向 (object-oriented) 的觀念,這在單元 10 到單元 12 才會陸續介紹,下一個單元先進入命名規則與習慣,了解怎麼命名變數與識別字 (identifier) 。
相關教學影片
中英文術語對照 | |
---|---|
布林 | boolean |
字元 | character |
類別 | class |
資料型態 | data type |
宣告 | declaration |
浮點數 | floating-point number |
列舉 | enumeration |
識別字 | identifier |
整數 | integer |
字面常數 | literal |
物件 | object |
物件導向 | object-oriented |
參考 | reference |
結構 | structure |
實值型態 | value type |
變數 | variable |
字長 | word length |
重點整理 |
---|
1. 1. C# 的資料型態分成兩大類型,實質型態與參考。 |
2. 使用變數前要先宣告,如果不指定型態可以用 var 宣告,宣告後的變數可以用等號用字面常數指派數值,或是用關鍵字 new 建立物件。 |
3. 實質型態包括整數、浮點數、字元、布林、列舉及結構,參考型態主要由類別定義。 |
4. 整數依據範圍及正負號有八種。 |
5. 浮點數依據範圍及精確度有三種。 |
6. 字元為 8 位元的整數。 |
7. 布林型態只有 true 及 false 兩種值。 |
8. 列舉為整數數列,結構為簡化的類別。 |
問題與討論 |
---|
1. 為什麼要把資料型態分成實質型態與參考? |
2. 為什麼整數要分成八種?浮點數要分成三種? |
3. 想一想,列舉型態可以用在哪些地方? |
4. 既然要設計類別,為什麼還要有簡化的結構呢? |
練習 |
---|
1. 建立一個新專案 Exercise0301 ,裡頭宣告建立 int 型態的變數 a ,並將 a 設定為 1 ,繼續宣告建立 string 型態的變數 b ,將變數 b 設定為 "2" ,繼續宣告建立 double 型態的變數 c ,將變數 c 設定為 3.0 ,最後印出這三個變數。 |
2. 建立一個新專案 Exercise0301 ,裡頭建立一個變數 a 、 b ,分別指派 true 及 false ,然後印出來 |
3. 建立一個新專案 Exercise0303 ,用 '*' 印出一個三角形。 |