控制流程是程式邏輯骨架。C# 提供 if/switch 選擇結構,以及 for/foreach/while/do-while 四種迴圈,本文詳細解析語法、陷阱與最佳實務。
if (boolExpr) statement;
if (boolExpr) statement1 else statement2;
// C/C++ 慣用寫法 (錯誤)
if (str.Length) { } // CS0029: 無法隱含轉換 int 到 bool
// C# 正確寫法
if (str.Length != 0) { }
if (str.Length > 0) { }
// C/C++ 易犯錯
if (x = 5) { } // 永真,C# 編譯錯誤
// C# 強制比較
if (x == 5) { }
&&:左側 false → 右側不執行||:左側 true → 右側不執行
// 危險:短路導致賦值不執行
if (true || (len = str.Length) > 0) { } // len 未賦值
// 建議:勿在條件式中執行有副作用的運算
switch (expr)
{
case const1: stmts; break;
case const2:
case const3: stmts; break; // 群組 case
default: stmts; break;
}
sbyte, byte, short, ushort, int, uint, long, ulong, char, string, enum 及可隱含轉換者。
// C# 錯誤:不允許隱含 fall-through
switch (n) { case 1: Do(); case 2: DoMore(); }
// 正確:明確 break 或 goto
switch (n)
{
case 1: Do(); break;
case 2: DoMore(); break;
}
// 需要合併邏輯:使用 goto case
switch (n)
{
case 2: goto case 3; // 明確跳轉
case 3: Handle2And3(); break;
case 4: goto default;
default: HandleOther(); break;
}
string name = "Chris";
switch (name)
{
case "Chris": Console.WriteLine("Hello Chris!"); break;
case "Admin": Console.WriteLine("Hello Admin!"); break;
}
for (init; condition; iterator) statement;
// 三段式皆可省略
for (;;) { if (done) break; } // 無限迴圈
for (int i = 0, j = 10; i < j; i++, j--) { ... }
long fact = 1;
for (long i = 1; i <= n; i++) fact *= i;
break:離開迴圈continue:跳過本次迭代,直接執行 iterator
foreach (Type item in collection) statement;
MoveNext() 與 Current 屬性ref/out 傳遞InvalidCastException
IDictionary env = Environment.GetEnvironmentVariables();
foreach (string key in env.Keys)
Console.WriteLine($"{key} = {env[key]}");
while (condition) statement;
// 條件為 bool,0 次或多次執行
using (var sr = File.OpenText("file.cs"))
{
string line;
while ((line = sr.ReadLine()) != null)
Console.WriteLine(line);
}
同 if,短路可能導致賦值不執行,建議分行寫。
do { statement; } while (condition);
// 保證至少執行一次
double sum = 0; int count = 0; char cont = 'y';
do
{
Console.Write("Enter value: ");
double v = double.Parse(Console.ReadLine());
sum += v; count++;
Console.Write("Continue? (y/n): ");
cont = Console.ReadLine()[0];
} while (cont == 'y');
Console.WriteLine($"Average = {sum / count}");
| 語句 | 用途 | 注意 |
|---|---|---|
| break | 離開 switch/迴圈 | 僅離開最內層 |
| continue | 跳過本次迴圈 | 僅用於迴圈 |
| goto | 跳轉標籤 | 慎用,switch 中允許 goto case/goto default |
| return | 離開方法 | |
| throw | 拋出例外 |
| 情境 | 建議結構 | 理由 |
|---|---|---|
| 雙向分支 | if-else | 清晰可讀 |
| 多重離散值比較 | switch | 效能優於 if 鏈,支援字串 |
| 已知迴圈次數 | for | 語意明確 |
| 列舉集合/陣列 | foreach | 簡潔、避免索引錯誤 |
| 條件未知次數 | while | 前置檢查 |
| 至少執行一次 | do-while | 後置檢查 |
| 需索引操作 | for / for (int i=0; i| foreach 不提供索引 | |
bool,無隱含轉換break/goto/return/throw 明確離開InvalidOperationExceptionitem = newVal 編譯錯誤while(true) 確保內部有 breakC# 控制流程語句在 C/C++ 基礎上強化型別安全 (bool 條件)、移除隱含貫穿、新增字串 switch 與 foreach 列舉。掌握四種迴圈適用場景、善用 break/continue 控制流向、避開短路副作用,即能撰寫清晰、健壯的流程邏輯。