陳述式 (C# 程式設計手冊)
程式所採取的動作是在陳述式中表示。 根據指定的條件,常見動作包括宣告變數、指派值、呼叫方法、循環執行集合,以及分支到一個或另一個程式碼區塊。 陳述式在程式中的執行順序稱為「控制流程」或「執行流程」。 根據程式如何反應它在執行階段收到的輸入,每次執行程式時,控制流程可能都會不同。
陳述式可以包含一行以分號結束的程式碼或區塊中的一連串單行陳述式。 陳述式區塊會用 {} 括弧括住,而且可以包含巢狀區塊。 下列程式碼示範兩個單行陳述式範例和多行陳述式區塊範例︰
public 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# 關鍵字/附註 |
---|---|
宣告陳述式 | 宣告陳述式引進新的變數或常數。 變數宣告可以將值選擇性指派給變數。 在常數宣告中,需要進行指派。 |
運算式陳述式 | 計算值的運算式陳述式必須將值儲存在變數中。 |
選取範圍陳述式 | 選取範圍陳述式可讓您根據一或多個指定的條件,分支到不同的程式碼區段。 如需詳細資訊,請參閱下列主題: |
反覆運算陳述式 | 反覆運算陳述式可讓您循環執行如陣列這類集合,或重複執行同一組陳述式,直到符合指定的條件為止。 如需詳細資訊,請參閱下列主題: |
跳躍陳述式 | 跳躍陳述式會將控制權轉移給另一個程式碼區段。 如需詳細資訊,請參閱下列主題: |
例外狀況處理陳述式 | 例外狀況處理陳述式可讓您順利復原在執行階段發生的例外狀況。 如需詳細資訊,請參閱下列主題: |
checked 和 unchecked |
checked 和 unchecked 陳述式可讓您指定,在將結果儲存在太小無法保存所產生值的變數中時,是否允許整數類型數值作業導致溢位。 |
await 陳述式 |
如果您使用 async 修飾詞來標示方法,可以在方法中使用 await 運算子。 當控制權到達 async 方法中的 await 運算式時,控制權會傳回給呼叫端,並暫止方法中的進度,直到等候的工作完成。 當工作完成時,方法中的執行可以繼續。如需簡單範例,請參閱方法的<非同步方法>一節。 如需詳細資訊,請參閱使用 async 和 await 進行非同步程式設計。 |
yield return 陳述式 |
迭代器會對集合執行自訂的反覆項目,例如清單或陣列。 迭代器會使用 yield return 陳述式,一次傳回一個項目。 當到達 yield return 陳述式時,系統會記住程式碼中的目前位置。 下一次呼叫迭代器時,便會從這個位置重新開始執行。如需詳細資訊,請參閱 Iterator。 |
fixed 陳述式 |
fixed 陳述式可防止記憶體回收行程重新配置可移動的變數。 如需詳細資訊,請參閱 fixed。 |
lock 陳述式 |
lock 陳述式可讓您限制一次只能存取一個執行緒的程式碼區塊。 如需詳細資訊,請參閱 lock。 |
標記陳述式 | 您可以提供陳述式標籤,然後使用 goto 關鍵字跳到標記陳述式。 (請參閱下面一列中的範例)。 |
空白陳述式 | 空陳述式包含一個分號。 它不會執行任何作業,而且可以用於需要陳述式但不需要執行任何動作的位置。 |
宣告陳述式
下列程式碼示範具有與沒有初始指派的變數宣告,以及經過必要初始化的常數宣告。
// Variable declaration statements.
double area;
double radius = 2;
// Constant declaration statement.
const double pi = 3.14159;
運算式陳述式
下列程式碼示範運算式陳述式,包括指派、具有指派的物件建立及方法引動過程。
// Expression statement (assignment).
area = 3.14 * (radius * radius);
// Error. Not statement because no assignment:
//circ * 2;
// Expression statement (method invocation).
System.Console.WriteLine();
// Expression statement (new object creation).
System.Collections.Generic.List<string> strings =
new System.Collections.Generic.List<string>();
空白陳述式
下列範例示範空陳述式的兩種用法:
void ProcessMessages()
{
while (ProcessMessage())
; // Statement needed here.
}
void F()
{
//...
if (done) goto exit;
//...
exit:
; // Statement needed here.
}
內嵌陳述式
某些陳述式,例如反覆陳述式的後面一律會有內嵌陳述式。 內嵌陳述式可能是單一陳述式或陳述式區塊中用 {} 括弧括住的多個陳述式。 甚至單行內嵌陳述式可以用 {} 括弧括住,如下列範例所示︰
// 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.";
無法達到的陳述式
如果編譯器判斷控制流程在任何情況下都永遠達不到特定陳述式,則會產生警告 CS0162,如下列範例所示︰
// An over-simplified example of unreachable code.
const int val = 5;
if (val < 4)
{
System.Console.WriteLine("I'll never write anything."); //CS0162
}