使用while語句,可以在一個布爾表達式為true的前提下重復運行一個語句。
while語句的語法如下:
while ( booleanExpression ) statement
首先會對布爾表達式進行求值,如果為true,就運行語句,然後再次求值布爾表達式。如果表達式仍為true,就再次運行語句,並再次求值表達式。這個過程會反復進行下去,直到布爾表達式求值為false;屆時,while語句將退出,並從while之後的第一個語句繼續。while語句在語法上與if語句有許多相似的地方(事實上,兩者除了關鍵字不同,語法是完全一樣的):
·表達式必須是一個布爾表達式。
·布爾表達式必須放在圓括號內。
·假如首次求值時,布爾表達式為false,語句不會運行。
·假如想要在一個while的控制下執行兩個或者更多的語句,必須使用大括號將語句分組到一個塊中。
以下while語句向控制台寫入0~9的值:
int i = 0; while (i != 10) { Console.WriteLine(i); i++; }
所有while語句都應該在某個時候終止。新手常犯的錯誤是忘記添加一個特別的語句,它最終能造成布爾表達式求值為false並終止循環。在上例中,i++;就屬於這種情況。
注意 while循環中的變量i控制著最終的循環次數。這是非常流行的一個表示法,具有這個作用的變量有時也稱為哨兵變量(Sentinel variable)。
在下面的練習中,准備寫一個while循環,它每次從一個源文件中讀取一行內容,並將每一行都寫入一個文本框中。
·使用while語句
1. 在Visual Studio 2005中打開WhileStatement項目,它位於My Documents文件夾下的\Microsoft Press\Visual CSharp Step by Step\Chapter 5\WhileStatement子文件夾中。
2. 選擇“調試”|“開始執行(不調試)”。
Visual Studio 2005將生成並運行這個Windows應用程序。應用程序本身是一個簡單的文本文件查看器,允許你選擇一個文件來顯示它的內容。
3. 單擊“Open File”(打開文件)按鈕。
隨後會出現“打開”對話框
4. 切換到My Documents文件夾下的\Microsoft Press\Visual CSharp Step by Step\ Chapter 5\WhileStatement\WhileStatement子文件夾。
5. 選中Form1.cs文件,再單擊“打開”。
文件名Form1.cs會在小的文本框中顯示,但文件的內容沒有在大文本框中顯示。這是由於我們還沒有實現相應的代碼來讀取源文件的內容,並在大文本框中顯示那些內容。下面的步驟將添加這個功能。
6. 關閉窗體,返回Visual Studio 2005。
7. 在“代碼和文本編輯器”窗口中顯示文件Form1.cs的代碼,找到openFileDialog_FileOk方法。
用戶在“打開”對話框中選擇了一個文件,並在單擊“打開”按鈕之後,調用該方法。方法的主體目前是:
string fullPathname = openFileDialog.FileName; FileInfo src = new FileInfo(fullPathname); filename.Text = src.Name; /* add while loop here */
第一個語句聲明了一個字符串變量,名為fullPathname,並把它初始化為openFileDialog對象的FileName屬性。該語句將fullPathname初始化為“打開”對話框中選擇的源文件的完整名稱(包括路徑)。
注意 openFileDialog對象是可以從“工具箱”中選取的OpenFileDialog組件的一個實例。利用這個組件提供的方法,你可以向用戶顯示一個標准的Windows“打開”對話框,讓用戶從中選擇一個文件,並獲取所選文件的名稱和路徑。
第二個語句聲明了一個名為src的FileInfo變量,並把它初始化成代表“打開”對話框中所選文件的一個對象(FileInfo是Microsoft .NET Framework提供的一個類,可利用它對文件進行各種處理)。
第三個語句將src變量的Name屬性賦給filename控件的Text屬性。src變量的Name屬性包含了在“打開”對話框中選定的文件名(但無路徑信息)。通過此次賦值,文件名會在Windows窗體的filename組件中顯示。
8. 將/* add while loop here */注釋替換成以下語句:
source.Text = "";
source字段是窗體上最大的文本框。把它的Text屬性設置成空字符串(""),就可以清除當前顯示的任何文本。
9. 在剛才在openFileDialog_FileOk方法中添加的那一行語句之後,輸入以下語句:
TextReader reader = src.OpenText();
該語句聲明了一個名為reader的TextReader變量 (TextReader是.NET Framework提供的另一個類,它用於從文件這樣的來源中讀取字符流。該類位於System.IO命名空間中)。OpenFileDialog類提供了OpenText方法,它用於打開用戶在“打開”對話框中選擇的文件。OpenText方法返回的是一個TextReader對象。上述語句的作用就是將reader初始化為從src.OpenText方法調用中返回的TextReader對象。現在,可以使用reader變量來讀取用戶選擇的文件中的內容。
10. 在添加到openFileDialog_FileOk方法的上一行語句之後,接著輸入以下語句:
string line = reader.ReadLine(); while (line != null) { source.Text += line + '\n'; line = reader.ReadLine(); } reader.Close();
上述代碼聲明了一個名為line的string變量,它用於容納reader從文件中讀取的每一行文本。語句調用reader.ReadLine方法從文件中讀取第一行文本。該方法要麼返回下一行文本,要麼返回一個名為null的特殊值(如果沒有更多的行可供讀取)。這個調用的結果將賦給line變量。
while循環開頭的布爾表達式檢查line變量的值。如果不為null,循環主體就顯示讀取的文本行,具體的做法是將該行附加到名為source的TextBox控件的Text屬性尾部,並在最後添加一個換行符('\n')。TextReader對象的ReadLine方法在讀取每一行的時候,會自動剝除換行符,所以需要重新添加這個換行符。隨後,while循環將讀取下一行文本(這是循環的“更新”語句),然後執行下一次重復。
循環結束後,調用extReader對象的Close方法來關閉文件。
提示 熟悉C#語法之後,你會發現while循環中的代碼能縮寫成下面這樣:
string line; while ((line = reader.ReadLine()) != null) { source.Text += line + '\n'; } reader.Close();
在這種情況下,循環開頭的布爾表達式同時還要執行初始化和更新操作。其中將調用ReadLine方法,並將返回值賦給line變量。然而,賦值語句實際會生成一個值——要賦值的表達式的值。所以,可以使用一個關系操作符來比較一個賦值表達式的結果,並最終生成一個布爾結果。在這個例子中,如果所賦的值為null,賦值表達式的值就是null,與null值比較的結果將為true。
11. 選擇“調試”|“開始執行(不調試)”。
12. 單擊“Open File”按鈕,隨後會出現“打開”對話框。
13. 切換到My Documents文件夾中的\Microsoft Press\Visual CSharp Step by Step\ Chapter 5\WhileStatement\WhileStatement子文件夾,選擇Form1.cs文件,並單擊 “打開”。
這一次,所選文件的內容將在文本框中完整地顯示出來,如圖1所示。
15. 關閉窗體。
返回Visual Studio 2005編程環境。