C# 入門指南

單元 3 - 實值型態與參考

~~學習進度表~~

C# 中的資料型態 (data type) 分成兩大類型,實值型態 (value type) 與參考 (reference)

Value Types ⇔ References

使用變數 (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# 中的所有整數型態

類型關鍵字位元數範圍
整數sbyte8-128 到 127
整數byte80 到 255
整數short16-32,768 到 32,767
整數ushort160 到 65,535
整數int32-2,147,483,648 到 2,147,483,647
整數uint320 到 4,294,967,295
整數long64-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
整數ulong640 到 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) 有以下三種

類型關鍵字位元數範圍
浮點數float32±1.5 x 10−45 到 ±3.4 x 1038
浮點數double64±5.0 × 10−324 到 ±1.7 × 10308
浮點數decmial128±1.0 x 10-28 到 ±7.9228 x 1028

浮點數的字面常數為帶小數點的數字,例如

double d = 1.0;

浮點數分成三種,且分別佔據三種不同的位元字長是因為可以計算的範圍不同,一般而言 double 會比 float 來得範圍更大而且更精確,至於 decmial 到 128 位元,可計算範圍卻更小,這是因為 decimal 的精確度更高,官方推薦 decimal 可作金融方面的數據計算。

整數是不帶小數點的數字,同時整數是明確的,因此電腦中可以直接儲存整數,帶小數點的浮點數卻不一樣,因為小數點的概念有點抽象,現在的電腦並沒有能精確儲存小數點的硬體,或者說,造價太高,現在電腦中的浮點數是利用整數模擬計算出來的,因此浮點數有準確度的問題。

字元 (character) 型態只有一種,如下表

類型關鍵字位元數範圍
字元charU+0000 到 U+FFFF

C# 字元型態採用單引號為字面常數,單引號內可以是任何的 Unicode 字元

char e = '丟';

由於 Unicode 編碼本身都帶有一個編碼數字,因此字元可以自動轉換成數字,例如

int f = e;

這樣變數 f 會得到整數 19999

布林 (boolean) 型態如下表

類型關鍵字位元數範圍
布林booltrue 或 false

布林型態的字面常數就是關鍵字 truefalse ,例如

bool g = true;

這樣變數 g 就會是 true

另外還有兩種實值型態,分別是列舉與結構,如下表

類型關鍵字位元數範圍
列舉enum須自行定義
結構struct須自行定義

列舉屬於簡易的整數數列,使用關鍵字 enum 宣告,例如

enum Day : byte {Sun=1, Mon, Tue, Wed, Thu, Fri, Sat};

以上列舉 Day 裡面的整數為 byte 型態,程式中的 Sun 表示整數 1Mon 表示整數 2 ,以此類推。

結構則是簡化的類別 (class) ,使用關鍵字 struct 宣告,例如

public struct Point
{
    public int x, y;

    public Point(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

這樣 Point 結構的變數就帶有兩個欄位 (field) ,分別是 xy ,定義時同樣要用關鍵字 new ,如下

Point p = new Point(10, 20);

列舉與結構的詳細定義與使用,請參考單元 9 - 列舉與結構。

結構就是定義簡單的物件 (object) ,更複雜的物件都應該要由類別來定義,使用關鍵字 class 定義的類別而建立的變數屬於參考,除了類別之外,使用關鍵字 delegatedynamicinterfaceobjectstring 宣告的項目也都屬於參考。

之後的單元會介紹如何使用這些關鍵字。

實務上定義類別很複雜,包括需要學習物件導向 (object-oriented) 的觀念,這在單元 10 到單元 12 才會陸續介紹,下一個單元先進入命名規則與習慣,了解怎麼命名變數與識別字 (identifier) 。

相關教學影片

上一頁 單元 2 - 在 Visual Studio Code 建立 C# 的 .NET 專案與執行
回 C# 入門指南首頁
下一頁 單元 4 - 命名規則與習慣
回 C# 教材首頁
回程式語言教材首頁
中英文術語對照
布林boolean
字元character
類別class
資料型態data type
宣告declaration
浮點數floating-point number
列舉enumeration
識別字identifier
整數integer
字面常數literal
物件object
物件導向object-oriented
參考reference
結構structure
實值型態value type
變數variable
字長word length
參考資料
1. Microsoft Docs | 實值型別 (C# 參考)
2. Microsoft Docs | bool (C# 參考)
3. Microsoft Docs | 整數的數字型別 (C# 參考)
4. Microsoft Docs | 浮點數值型別 (C# 參考)
5. Microsoft Docs | char (C# 參考)
6. Microsoft Docs | enum (C# 參考)
7. Microsoft Docs | struct (C# 參考)
8. Microsoft Docs | 參考型別 (C# 參考)
8. Microsoft Docs | 類別 (C# 參考)
9. Microsoft Docs | 內建參考型別 (C# 參考)
重點整理
1. 1. C# 的資料型態分成兩大類型,實質型態與參考。
2. 使用變數前要先宣告,如果不指定型態可以用 var 宣告,宣告後的變數可以用等號用字面常數指派數值,或是用關鍵字 new 建立物件。
3. 實質型態包括整數、浮點數、字元、布林、列舉及結構,參考型態主要由類別定義。
4. 整數依據範圍及正負號有八種。
5. 浮點數依據範圍及精確度有三種。
6. 字元為 8 位元的整數。
7. 布林型態只有 truefalse 兩種值。
8. 列舉為整數數列,結構為簡化的類別。
問題與討論
1. 為什麼要把資料型態分成實質型態與參考?
2. 為什麼整數要分成八種?浮點數要分成三種?
3. 想一想,列舉型態可以用在哪些地方?
4. 既然要設計類別,為什麼還要有簡化的結構呢?
練習
1. 建立一個新專案 Exercise0301 ,裡頭宣告建立 int 型態的變數 a ,並將 a 設定為 1 ,繼續宣告建立 string 型態的變數 b ,將變數 b 設定為 "2" ,繼續宣告建立 double 型態的變數 c ,將變數 c 設定為 3.0 ,最後印出這三個變數。
2. 建立一個新專案 Exercise0301 ,裡頭建立一個變數 ab ,分別指派 truefalse ,然後印出來
3. 建立一個新專案 Exercise0303 ,用 '*' 印出一個三角形。