陳述式 (C# 程式設計手冊)
程式中採用的動作以「陳述式」(Statement) 表示。 一般動作包括宣告變數、指派值、呼叫方法、在集合中執行迴圈,以及分支前往一個或另一個程式碼區塊 (視給定的條件而定)。 程式中陳述式的執行順序稱為「控制流程」(Flow Of Control) 或「執行流程」(Flow Of Execution)。 依據程式對其在執行階段收到之輸入的回應而定,每次程式執行時的控制流程可能都不一樣。
陳述式可以包含結尾為分號的單行程式碼,也可以包含內含一組單行陳述式的區塊。 陳述式區塊以 {} 括弧括住,而且可以包含巢狀區塊。 下列程式碼顯示兩個範例,一個是單行陳述式,一個是單行陳述式區塊:
static void Main()
{
// Declaration statement.
int counter;
// Assignment statement.
counter = 1;
// Error! This is an expression, not an expression statement.
// counter + 1;
// Declaration statements with initializers are functionally
// equivalent to declaration statement followed by assignment statement:
int[] radii = { 15, 32, 108, 74, 9 }; // Declare and initialize an array.
const double pi = 3.14159; // Declare and initialize constant.
// foreach statement block that contains multiple statements.
foreach (int radius in radii)
{
// Declaration statement with initializer.
double circumference = pi * (2 * radius);
// Expression statement (method invocation). A single-line
// statement can span multiple text lines because line breaks
// are treated as white space, which is ignored by the compiler.
System.Console.WriteLine("Radius of circle #{0} is {1}. Circumference = {2:N2}",
counter, radius, circumference);
// Expression statement (postfix increment).
counter++;
} // End of foreach statement block
} // End of Main method body.
} // End of SimpleStatements class.
/*
Output:
Radius of circle #1 = 15. Circumference = 94.25
Radius of circle #2 = 32. Circumference = 201.06
Radius of circle #3 = 108. Circumference = 678.58
Radius of circle #4 = 74. Circumference = 464.96
Radius of circle #5 = 9. Circumference = 56.55
*/
陳述式類別
下表列出 C# 各種陳述式類型及其關聯的關鍵字,以及提供更多資訊的主題連結:
分類 |
C# 關鍵字/附註 |
---|---|
宣告陳述式 |
宣告陳述式 (Declaration Statement) 可引進一個新變數或常數。 變數宣告可以選擇要或不要指派值給變數。 常數宣告則一定要進行指派。 |
運算陳述式 |
用於計算值的運算陳述式 (Expression Statement),必須將值儲存在變數中。
|
選擇陳述式 (Selection Statement) 可讓您根據一個或多個指定條件,分支前往不同的程式碼區段。 如需詳細資訊,請參閱下列主題: |
|
反覆運算陳述式可讓您在集合 (例如陣列) 中執行迴圈,或重複執行相同的一組陳述式,直到符合指定的條件為止。 如需詳細資訊,請參閱下列主題: |
|
跳躍陳述式 (Jump Statement) 可將控制轉移到另一個程式碼區段。 如需詳細資訊,請參閱下列主題: |
|
例外狀況處理 (Exception Handling) 陳述式可讓您順利地從執行階段發生的例外情況復原。 如需詳細資訊,請參閱下列主題: |
|
Checked 和 Unchecked 陳述式可讓您指定當數值運算用來儲存結果的變數因為太小而無法保存結果值時,是否允許數值運算溢位。 如需詳細資訊,請參閱 checked (C# 參考) 和 unchecked (C# 參考)。 |
|
await 陳述式 |
如果您將標記為已與 非同步 修飾詞的方法,您可以使用方法在 等候 運算子。 當控制項到達非同步方法的一個 await 表示,控制項傳回至呼叫端,因此,在方法的進度暫止,直到等候的工作完成。 當工作完成時,則會從方法可以復原。 如需簡單範例,請參閱 方法 (C# 程式設計手冊)「Async 方法>一節。 如需詳細資訊,請參閱使用 Async 和 Await 設計非同步程式 (C# 和 Visual Basic)。 |
yield return 陳述式 |
Iterator 對集合的自訂反覆運算,例如清單或陣列。 Iterator 使用 yield return 陳述式傳回每個項目一次一個。 當 yield return 陳述式到達,目前位置在程式碼中的事項。 當 Iterator,下次呼叫時,執行與該位置重新開始。 如需詳細資訊,請參閱Iterator (C# 和 Visual Basic)。 |
fixed 陳述式 |
fixed 陳述式可讓記憶體回收行程避免重新配置可移動的變數。 如需詳細資訊,請參閱 fixed 陳述式 (C# 參考)。 |
lock 陳述式 |
lock 陳述式可讓您將程式碼區塊的存取限制為一次僅限一個執行緒。 如需詳細資訊,請參閱 lock 陳述式 (C# 參考)。 |
標記陳述式 |
您可以提供標記給陳述式,然後使用 goto (C# 參考) 關鍵字跳至標記陳述式 (Label Statement) (請參閱下一列的範例)。 |
空白陳述式 |
空白陳述式只包含一個分號, 不會執行任何動作,可以用在需有陳述式但不需要執行動作的地方。 下列範例顯示空白陳述式的兩種用法: |
內嵌陳述式
有些陳述式 (包括 do、while、for 和 foreach) 其後總會跟著內嵌陳述式。 這種內嵌陳述式可以是單一陳述式,也可以是以 {} 括弧括住內含多行陳述式的陳述式區塊。 單行內嵌陳述式也可以用 {} 括弧括住,如下列範例所示:
// Recommended style. Embedded statement in block.
foreach (string s in System.IO.Directory.GetDirectories(
System.Environment.CurrentDirectory))
{
System.Console.WriteLine(s);
}
// Not recommended.
foreach (string s in System.IO.Directory.GetDirectories(
System.Environment.CurrentDirectory))
System.Console.WriteLine(s);
未以 {} 括弧括住的內嵌陳述式不能為宣告或標記陳述式。 這會在下列範例中示範:
if(pointB == true)
//Error CS1023:
int radius = 5;
將內嵌陳述式置入區塊,修正錯誤:
if (b == true)
{
// OK:
System.DateTime d = System.DateTime.Now;
System.Console.WriteLine(d.ToLongDateString());
}
巢狀陳述式區塊
陳述式區塊也可以形成巢狀,如下列程式碼所示:
foreach (string s in System.IO.Directory.GetDirectories(
System.Environment.CurrentDirectory))
{
if (s.StartsWith("CSharp"))
{
if (s.EndsWith("TempFolder"))
{
return s;
}
}
}
return "Not found.";
不可能執行到的陳述式
如果編譯器 (Compiler) 判斷控制流程在任何情況下都不可能執行到某個特定陳述式,就會產生警告 CS0162,如下列範例所示:
// An over-simplified example of unreachable code.
const int val = 5;
if (val < 4)
{
System.Console.WriteLine("I'll never write anything."); //CS0162
}
相關章節
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格。語言規格是 C# 語法和用法的限定來源。