6.1.1 if 語句
最先且最常用到的語句是 if 語句。內含語句是否被執行取決於布林運算式:
if (布林運算式) 內含語句
當然,也可以有else 分枝,當布林運算式的值為假時,該分枝就被執行:
if (布林運算式) 內含語句 else 內含語句
在執行某些語句之前就檢查一個非零長字串的例子:
if (0 != strTest.Length)
{
}
這是一個布林運算式。(!=表示不等於。) 但是,如果你來自C或者C++,可能會習慣於編寫象這樣的代碼:
if (strTest.Length)
{
}
這在C#中不再工作,因為 if 語句僅允許布爾( bool) 資料類型的結果,而字串的Length屬性對象返回一個整形(integer)。編譯器將出現以下錯誤資訊:
error CS0029: Cannot implicitly convert type 'int' to 'bool' (不能隱式地轉換類型 'int' 為 'bool'。)
上邊是你必須改變的習慣,而下邊將不會再在 if 語句中出現賦值錯誤:
if (nMyValue = 5) ...
6.2 迴圈語句
當你想重複執行某些語句或語段時,依據當前不同的任務,C#提供4個不同的迴圈語句選擇給你使用:
。 for 語句
。foreach 語句
。 while 語句
。do 語句
6.2.1 for 語句
當你預Crowdsourced Security Testing道一個內含語句應要執行多少次時,for 語句特別有用。當條件為真時,常規文法允許重複地執行內含語句(和迴圈運算式):
for (初始化;條件;迴圈) 內含語句
請注意,初始化、條件和迴圈都是可選的。如果忽略了條件,你就可以產生一個死迴圈,要用到跳躍陳述式(break 或goto)才能退出。
for (;;)
{
break; // 由於某些原因
}
另外一個重點是,你可以同時加入多條由逗號隔開的語句到for迴圈的所有三個參數。例如,你可以初始化兩個變數、擁有三個條件陳述式,並重複4個變數。
作為C或C++程式員,你必須瞭解僅有的一個變化:條件陳述式必須為布林運算式,就象 if 語句一樣。
清單6.4 包含使用 for 語句的一個例子。它顯示了如何計算一個階乘,比使用遞迴函式調用還要快。
清單 6.4 在for 迴圈裡計算一個階乘
1: using System;
2:
3: class Factorial
4: {
5: public static void Main(string[] args)
6: {
7: long nFactorial = 1;
8: long nComputeTo = Int64.Parse(args[0]);
9:
10: long nCurDig = 1;
11: for (nCurDig=1;nCurDig <= nComputeTo; nCurDig++)
12: nFactorial *= nCurDig;
13:
14: Console.WriteLine("{0}! is {1}",nComputeTo, nFactorial);
15: }
16: }
6.2.4 do 語句
C#最後可利用的迴圈語句是do語句。它與while語句十分相似,僅當經過最初的迴圈之後,條件才被驗證。
do
{
內含語句
}
while (條件);
do語句保證內含語句至少被執行過一次,而且只要條件求值等於真,它們繼續被執行。通過使用break語句,你可以迫使運行退出 do 語塊。如果你想跳過這一次迴圈,使用continue語句。
一個如何使用do語句的例子顯示在清單 6.7中。它向使用者請求一個或多個數字,並且當執行程式退出do迴圈後計算平均值。
清單 6.7 在do 迴圈中計算平均值
1: using System;
2:
3: class ComputeAverageApp
4: {
5: public static void Main()
6: {
7: ComputeAverageApp theApp = new ComputeAverageApp();
8: theApp.Run();
9: }
10:
11: public void Run()
12: {
13: double dValue = 0;
14: double dSum = 0;
15: int nNoOfValues = 0;
16: char chContinue = 'y';
17: string strInput;
18:
19: do
20: {
21: Console.Write("Enter a value: ");
22: strInput = Console.ReadLine();
23: dValue = Double.Parse(strInput);
24: dSum += dValue;
25: nNoOfValues++;
26: Console.Write("Read another value?");
27:
28: strInput = Console.ReadLine();
29: chContinue = Char.FromString(strInput);
30: }
31: while ('y' == chContinue);
32:
33: Console.WriteLine("The average is {0}",dSum / nNoOfValues);
34: }
35: }
在這個例子裡,我在靜態 Main函數中執行個體化 ComputeAverageApp類型的一個對象。它同樣接著調用執行個體的Run方法,該方法包含了計算平均值所有必要的功能。
do 迴圈跨越第19~31行。條件是這樣設定的:分別回答各個問題 “y”,以決定是否要增加另一個值。輸入任何其它字元會引起程式退出 do語塊,且平均值被計算。
正如你可以從提到的例子看出,do語句和while語句差別不太大——僅有的差別就是條件在什麼時候被求值。
6.3 小結
這章解釋了如何使用C#中用到的各種選擇和迴圈語句。 if 語句在應用程式中可能是最為常用的語句。當在布林運算式中使用計算時,編譯器會為你留意。但是,你一定要確保條件陳述式的短路不會阻止必要代碼的運行。
switch 語句——儘管同樣與C語言的相應部分相似——但也被改善了。直達不再被支援,而且你可以使用字串標籤,對於C程式員,這是一種新的用法。
在這一章的最後部分,我說明如何使用for、foreach、while和do語句。陳述式完成各種需要,包括執行固定次數的迴圈、列舉收集元素和執行基於某些條件的任意次數的語句。