5.2 使用while语句使用while语句,可在条件为true的前提下重复运行一个语句。while语句的语法如下:
while ( booleanExpression )
statement
该语句先对booleanExpression(布尔表达式)求值,如果为true,就运行语句。然后再次求值booleanExpression。如果结果仍为true,就再次运行语句,并再次求值booleanExpression。这个过程会反复进行下去,直到结果为false。届时,while语句将退出,并从while之后的第一个语句继续。while语句在语法上与if语句有许多相似的地方(事实上,两者除了关键字不同,语法是完全相同的),具体如下。
● 表达式必须是一个布尔表达式。
● 布尔表达式必须放在圆括号内。
● 假如首次求值时,布尔表达式为false,语句(statement)不会运行。
● 要想在一个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 2010中打开WhileStatement项目,它位于“文档”文件夹下的\Microsoft Press\Visual CSharp Step by Step\Chapter 5\WhileStatement子文件夹中。
2. 在“调试”菜单中选择“开始执行(不调试)”。 Visual Studio 2010将生成并运行这个Windows应用程序。应用程序本身是一个简单的文本文件查看器,可用于打开一个文件来查看它的内容。
3. 单击“Open File”(打开文件)按钮。 随后会出现“打开”对话框。
4. 切换到“文档”文件夹下的\Microsoft Press\Visual CSharp Step by Step\Chapter 5\WhileStatement\WhileStatement子文件夹。
5. 选中MainWindow.xaml.cs文件,再单击“打开”。 文件名MainWindow.xaml.cs会在小文本框中显示,但文件的内容没有在大文本框中显示。这是由于我们还没有实现相应的代码来读取并显示源文件的内容。下面的步骤将添加这个功能。
6. 关闭窗体,返回Visual Studio 2010编程环境。
7. 在“代码和文本编辑器”窗口中打开MainWindow.xaml.cs文件,找到OpenFileDialogFileOk方法。 用户在“打开”对话框中选择一个文件并在单击“打开”按钮之后,该方法将被调用。方法的主体目前是像下面这样实现的:
private void OpenFileDialogFileOk(object sender, System.ComponentModel.CancelEventArgs e)
{
string fullPathname = OpenFileDialog.FileName;
FileInfo src = new FileInfo(fullPathname);
filename.Text = src.Name;
//add while loop here
第一个语句声明了名为fullPathname的一个string变量,并把它初始化为
OpenFileDialog对象的FileName属性。这个属性包含了在“打开”对话框中选择的一个源文件的完整名称(包括路径)。
注意 OpenFileDialog对象是OpenFileDialog类的一个实例。利用这个类提供的方法,可以向用户显示一个标准的Windows?打开?对话框,让用户从中选择一个文件,并获取所选文件的名称和路径。这是.NET Framework类库提供的用于执行常见任务的众多类之一,用户可用它选择一个文件。这些类统称为?通用对话框?(Common Dialog)。有关它们的详情将在第23章讨论。
第二个语句声明一个名为src的FileInfo变量,并把它初始化为代表“打开”对话框中所选文件的一个对象(FileInfo是Microsoft .NET Framework提供的一个类,可利用它对文件进行各种操作)。
第三个语句将src变量的Name属性赋给filename控件的Text属性。src变量的Name属性包含了在“打开”对话框中选定的那个文件的名称(但无路径信息)。像这样赋值之后,文件名就会在窗体的filename文本框(小的文本框)中显示出来。
8. 将// add while loop here注释替换成以下语句:
source.Text = "";
source是窗体上最大的那个文本框。把它的Text属性设为空字符串(""),就可以清除当前显示的任何文本。
9. 在刚才输入的语句之后,输入以下语句:
TextReader reader = src.OpenText();
上述语句声明了一个名为reader的TextReader变量(TextReader是.NET Framework提供的另一个类,它用于从文件这样的来源中读取字符流。该类位于System.IO命名空间中)。FileInfo类提供了OpenText方法,用于打开一个文件来进行读取。上述语句的作用是打开用户在“打开”对话框中选定的文件,使reader变量能够读取该文件的内容。
10. 在刚才输入的语句之后,输入以下语句:
string line = reader.ReadLine();
上述语句声明了一个名为line的string变量,并调用reader.ReadLine方法把文件中的第一行文本读入这个变量。该方法要么返回读取的一行文本;要么返回一个特殊值null来表明没有更多的行可供读取。如果一行文本都没有返回,表明这是一个空文件。
11. 在刚才输入的代码之后继续输入以下代码:
while (line != null)
{
source.Text += line + '\n';
line = reader.ReadLine();
}
以上while循环将依次读取文件的每一行,直到没有更多的行为止。 while循环开头的布尔表达式检查line变量的值。如果不为null,就显示读取的行,具体的做法是将该行附加到source文本框的Text属性上,并在最后添加一个换行符('\n')。TextReader对象的ReadLine方法在读取每一行的时候,会自动删除换行符,所以需要重新添加这个换行符。随后,在下次循环之前,while循环将读取下一行文本。如果文件中没有更多的文本,ReadLine就会返回一个null值,这会造成while循环终止。
12. 在while循环的}之后添加以下语句:
reader.Close();
该语句将关闭文件。任何文件用过之后都应该关闭,这是必须养成的一个好习惯。它使其他应用程序能使用该文件,同时释放读取文件所需的任何内存和其他资源。
13. 在“调试”菜单中选择“开始执行(不调试)”。
14. 在窗体出现之后,单击Open File按钮。
15. 在“打开”对话框中,切换到“文档”文件夹下的\Microsoft Press\Visual CSharp Step by Step\ Chapter 5\WhileStatement\WhileStatement子文件夹,选择MainWindow.xaml.cs文件,单击“打开”。 这一次,所选文件的内容将在文本框中完整地显示出来,可以看到刚才输入的代码,如下图所示。
16. 在文本框中滚动文本,找到OpenFileDialogFileOk方法。验证该方法已经包含刚才添加的代码。
17. 关闭窗体,并返回Visual Studio 2010编程环境。