重要提示 假如遺漏大括號,將造成兩個嚴重後果。首先,C#編譯器只將第一個語句(seconds=0)與if語句關聯起來,下一個語句(minutes++)將不再成為if語句的一部分。其次,當編譯器遇到else關鍵字時,不會將它與前一個if語句關聯起來,所以會報告語法錯誤。
嵌套if語句
可以在一個if語句中嵌套其他if語句。這樣一來,就可以將一系列布爾表達式鏈接起來,它們將依次測試,直到其中一個求值為true。在下例中,假如day值為0,則第一個測試求值為true,值"Sunday"將賦給dayName變量。假如day值不為0,則第一個測試失敗,控制將傳遞給else子句。該子句將運行第二個if語句,將day的值與1進行比較。注意,只有在第一個if測試為false的前提下,才會執行第二個if。類似地,只有在第一個和第二個if測試為false的前提下,才會執行第三個if。
if (day == 0)
dayName = "Sunday";
else if (day == 1)
dayName = "Monday";
else if (day == 2)
dayName = "Tuesday";
else if (day == 3)
dayName = "Wednesday";
else if (day == 4)
dayName = "Thursday";
else if (day == 5)
dayName = "Friday";
else if (day == 6)
dayName = "Saturday";
else
dayName = "unknown";
在下面的練習中,我們將寫一個方法,以便使用嵌套的if語句來比較兩個日期。
一、編寫if語句
1. 啟動Microsoft Visual Studio 2005。
2. 打開Selection項目,它位於My Documents文件夾下的\Microsoft Press\Visual CSharp Step by Step\Chapter 4\Selection子文件夾中。
3. 選擇“調試”|“開始執行(不調試)”。
Visual Studio 2005將生成並運行應用程序。窗體上顯示了兩個DateTimePicker控件,分別名為first和second(這種控件將顯示一個日歷,便於用戶通過單擊下拉按鈕來選擇一個日期)。兩個控件當前都設置成今天的日期。
4. 單擊Compare按鈕。
文本框中會顯示以下內容:
first == second : False
first != second : True
first < second : False
first <= second : False
first > second : True
first >= second : True
上述結果明顯有問題!如圖1所示布爾表達式first == second應該為true,因為first和second都被設置成今天的日期。事實上,在上述結果中,似乎只有操作符<和操作符>=的結果才是正確的!
圖1 文本框內的內容
5. 單擊Quit。
隨後將返回Visual Studio 2005編程環境。
6. 在“代碼和文本編輯器”窗口中顯示Form1.cs的代碼,找到compare_Click方法,如下所示:
private int compare_Click(object sender, System.EventArgs e)
{
int diff = dateCompare(first.Value, second.Value);
info.Text = "";
show("first == second", diff == 0);
show("first != second", diff != 0);
show("first < second", diff < 0);
show("first <= second", diff <= 0);
show("first > second", diff > 0);
show("first >= second", diff >= 0);
}
單擊窗體上的Compare按鈕,就會執行這個方法。該方法獲取窗體上的first和second這兩個DateTimePicker控件中顯示的日期值,並調用另一個名為dateCompare的方法來比較它們。我們將在下一個步驟中具體討論dateCompare方法,這裡只是簡單地說一下。該方法的作用是比較它的兩個參數值,並根據比較結果來返回一個整數值。如果兩個值相同,就返回零;如果first的值小於second的值,就返回-1;如果first的值大於second的值,就返回+1(假如一個日期在日歷上排在另一個日期的後面,就說前者大於後者)。
show方法用於在窗體上的info文本框控件中顯示比較結果。
7. 找到dateCompare方法,如下所示:
private int dateCompare(DateTime leftHandSide, DateTime rightHandSide)
{
// TO DO
return 42;
}
該方法目前在調用後始終返回同一個值,而不是通過比較參數值來返回0,-1或+1。這解釋了為什麼應用程序不像我們期望的那樣工作!現在,需要實現這個方法,讓它正確地比較兩個日期。
8. 從dateCompare方法中移除// TO DO注釋和return語句。
9. 在dateCompare方法主體中輸入以下語句:
int result;
if (leftHandSide.Year < rightHandSide.Year)
result = -1;
else if (leftHandSide.Year > rightHandSide.Year)
result = +1;
else if (leftHandSide.Month < rightHandSide.Month)
result = -1;
else if (leftHandSide.Month > rightHandSide.Month)
result = +1;
else if (leftHandSide.Day < rightHandSide.Day)
result = -1;
else if (leftHandSide.Day > rightHandSide.Day)
result = +1;
else
result = 0;
return result;
假如leftHandSide.Year < rightHandSide.Year和leftHandSide.Year > rightHandSide.Year為false,那麼leftHandSide.Year == rightHandSide.Year肯定為true,程序流程將正確轉移,開始比較lhs和rhs的Month屬性。類似地,假如leftHandSide.Month < rightHandSide.Month和leftHandSide.Month > rightHandSide.Month為false,那麼leftHandSide.Month == rightHandSide.Month肯定為true,程序將開始比較lhs和rhs的Day屬性。最後,假如leftHandSide.Day < rightHandSide.Day和leftHandSide.Day > rightHandSide.Day為false,那麼leftHandSide.Day == rightHandSide.Day肯定為true;另外,由於在這時候,Month和Year屬性也肯定為true,所以兩個日期肯定是相同的。
10. 選擇“調試”|“開始執行(不調試)”。
應用程序將重新生成並重新啟動。同樣地,兩個DateTimePicker控件(first和second)將設置成今天的日期。
11. 單擊Compare按鈕。
文本框中會顯示以下內容:
first == second : True
first != second : False
first < second : False
first <= second : True
first > second : False
first >= second : True
這個結果才是正確的。
12. 將second這個DateTimePicker控件的日期調到明天。
13. 再次單擊Compare按鈕。
文本框中會顯示以下內容:
first == second : False
first != second : True
first < second : True
first <= second : True
first > second : False
first >= second : False
同樣地,這些結果是正確的。
14. 單擊Quit。