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 語句 當你預先知道一個內含語句應要執行多少次時,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語句。語句完成各種需要,包括執行固定次數的循環、列舉收集元素和執行基於某些條件的任意次數的語句。