十六、switch 陳述式增強
支援型別
- 整數型別 (sbyte, byte, short, ushort, int, uint, long, ulong)
char
string (C# 獨有,Java/C++ 不支援)
enum
無隱含貫穿
switch (value) {
case 1: Do1(); break; // 必須 break/return/throw/goto
case 2: Do2(); break;
default: DoDefault(); break;
}
// 不允許 case 1 直接落入 case 2 (需 goto case 2)
模式比對 switch (C# 7.0+)
public static string Describe(object obj) => obj switch {
int i when i > 0 => $"Positive int: {i}",
int i => $"Int: {i}",
string s when s.Length > 10 => "Long string",
string s => $"String: {s}",
null => "Null",
_ => "Unknown"
};
switch 運算式 (C# 8.0+)
var result = value switch {
1 => "One",
2 => "Two",
_ => "Other"
};
十七、預定義型別
完整列表
| 別名 | .NET 型別 | 大小 | 範圍/精度 |
sbyte | System.SByte | 8-bit | -128 ~ 127 |
byte | System.Byte | 8-bit | 0 ~ 255 |
short | System.Int16 | 16-bit | -32,768 ~ 32,767 |
ushort | System.UInt16 | 16-bit | 0 ~ 65,535 |
int | System.Int32 | 32-bit | -2B ~ 2B |
uint | System.UInt32 | 32-bit | 0 ~ 4B |
long | System.Int64 | 64-bit | -9E18 ~ 9E18 |
ulong | System.UInt64 | 64-bit | 0 ~ 1.8E19 |
char | System.Char | 16-bit | U+0000 ~ U+FFFF |
float | System.Single | 32-bit | 7 位數精度 |
double | System.Double | 64-bit | 15-16 位數精度 |
decimal | System.Decimal | 128-bit | 28-29 位數精度,財務計算首選 |
bool | System.Boolean | - | true/false |
decimal 特性
- 128 位 (16 bytes),非 IEEE 754 浮點數
- 基 10 指數,精確表示十進位小數 (0.1 無誤差)
- 範圍較 float/double 小,但精度極高
- 適合財務、货幣計算
十八、欄位修飾詞
| 修飾詞 | 說明 | 對比 Java |
const | 編譯期常數,值內嵌至 IL,隱含 static | 同 final static |
readonly | 執行期常數,可在建構子指派,支援版本演進 | 無直接對應 |
static | 類別級欄位 | 同 |
volatile | 禁止編譯器/CPU 重排序,確保執行緒可見性 | 同 |
initonly (IL) | readonly 的 IL 名稱 | - |
const vs readonly 版本演進
// 組件 A v1
public class Config {
public const string Version = "1.0"; // 編譯期內嵌
public static readonly string BuildDate = DateTime.Now.ToString(); // 執行期
}
// 組件 B 參考 A
Console.WriteLine(Config.Version); // IL 內嵌 "1.0"
Console.WriteLine(Config.BuildDate); // 執行期讀取 A 的欄位
// 組件 A v2 修改 Version = "2.0", 重新編譯 A
// 組件 B 未重新編譯:Version 仍顯示 "1.0" (已內嵌)
// 組件 B 未重新編譯:BuildDate 顯示新值 (執行期讀取)
十九、跳轉陳述式
goto
- 標籤跳轉:
goto Label; ... Label: ;
- switch 內跳轉:
goto case 2;, goto default;
- 限制:只能跳出巢狀區塊,不可跳入
finally 區塊內 goto 只能跳往同一 finally 內標籤
break / continue
break:跳出最近迴圈/switch
continue:跳過本次迴圈進入下次
- 不支援標籤 (Java 支援
break label)
return / throw
return:離開方法,可回傳值
throw:拋出例外
總結
C# switch 支援字串、無隱含貫穿、模式比對大幅增強表達力。decimal 解決財務精度問題。readonly 支援版本演進優於 const。goto 受限但保留 switch 內跳轉實用性。理解這些細節能寫出更正確、高效、可維護的程式碼。