首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

2.5.2  循环

C#提供了4种不同的循环机制(forwhiledo...whileforeach),在满足某个条件之前,可以重复执行代码块。forwhiledo...while循环与C++中的对应循环相同。

1. for循环

C#for循环提供的迭代循环机制是在执行下一次迭代前,测试是否满足某个条件,其语法如下:

for (initializer; condition; iterator)

   statement(s)

其中:

       initializer是指在执行第一次迭代前要计算的表达式(通常把一个局部变量初始化为循环计数器)

       condition是在每次迭代新循环前要测试的表达式(它必须等于true,才能执行下一次迭)

       iterator是每次迭代完要计算的表达式(通常是递增循环计数器)。当condition等于false时,迭代停止。

for循环是所谓的预测试循环,因为循环条件是在执行循环语句前计算的,如果循环条件为假,循环语句就根本不会执行。

for循环非常适合于一个语句或语句块重复执行预定的次数。下面的例子就是for循环的典型用法,这段代码输出从0~99的整数:

for (int i = 0; i < 100; i = i+1)   // this is equivalent to

                           // For i = 0 To 99 in VB.

{

   Console.WriteLine(i);

}

这里声明了一个int类型的变量i,并把它初始化为0,用作循环计数器。接着测试它是否小于100。因为这个条件等于true,所以执行循环中的代码,显示值0。然后给该计数器加1,再次执行该过程。当i等于100时,循环停止。

实际上,上述编写循环的方式并不常用。C#在给变量加1时有一种简化方式,即不使用i = i+1,而简写为i++

for (int i = 0; i < 100; i++)

{

//etc.

C#for循环语法比VB中的ForNext循环的功能强大得多,因为迭代器可以是任何语句。在VB中,只能对循环控制变量加减某个数字。在C#中,则可以做任何事,例如,让循环控制变量乘以2

嵌套的for循环非常常见,在每次迭代外部的循环时,内部循环都要彻底执行完毕。这种模式通常用于在矩形多维数组中遍历每个元素。最外部的循环遍历每一行,内部的循环遍历某行上的每个列。下面的代码显示数字行,它还使用另一个Console方法Console.Write(),该方法的作用与Console.WriteLine()相同,但不在输出中添加回车换行符:

using System;

 

namespace Wrox.ProCSharp.Basics

{

   class MainEntryPoint

   {

      static void Main(string[ ] args)

      {

         // This loop iterates through rows...

         for (int i = 0; i < 100; i+=10)

         {

            // This loop iterates through columns...

            for (int j = i; j < i + 10; j++)

            {

               Console.Write("  " + j);

            }

            Console.WriteLine();

         }

      }

   }

}

尽管j是一个整数,但它会自动转换为字符串,以便进行连接。C++开发人员要注意,这比在C++中处理字符串容易得多,VB开发人员则已经习惯于此了。

C程序员应注意上述例子中的一个特殊功能。在每次迭代后续的外部循环时,最内部循环的计数器变量都要重新声明。这种语法不仅在C#中可行,在C++中也是合法的。

上述例子的结果是:

csc NumberTable.cs

Microsoft (R) Visual C# .NET Compiler version 8.00.40607.16

for Microsoft (R) .NET Framework version 2.0.40607

Copyright (C) Microsoft Corporation 2001-2003. All rights reserved.

 

  0  1  2  3  4  5  6  7  8  9

  10  11  12  13  14  15  16  17  18  19

  20  21  22  23  24  25  26  27  28  29

  30  31  32  33  34  35  36  37  38  39

  40  41  42  43  44  45  46  47  48  49

  50  51  52  53  54  55  56  57  58  59

  60  61  62  63  64  65  66  67  68  69

  70  71  72  73  74  75  76  77  78  79

  80  81  82  83  84  85  86  87  88  89

  90  91  92  93  94  95  96  97  98  99

尽管在技术上,可以在for循环的测试条件中计算其他变量,而不计算计数器变量,但这不太常见。也可以在for循环中忽略一个表达式(甚或所有表达式)。但此时,要考虑使用while循环。

2. while循环

while循环与C++Java中的while循环相同,与VB中的While...Wend循环相同。与for循环一样,while也是一个预测试的循环。其语法是类似的,但while循环只有一个表达式:

while(condition)

   statement(s);

for循环不同的是,while循环最常用于下述情况:在循环开始前,不知道重复执行一个语句或语句块的次数。通常,在某次迭代中,while循环体中的语句把布尔标记设置为false,结束循环,如下面的例子所示。

bool condition = false;

while (!condition)

{

   // This loop spins until the condition is true

   DoSomeWork();

   condition = CheckCondition();   // assume CheckCondition() returns a bool

}

所有的C#循环机制,包括while循环,如果只重复执行一条语句,而不是一个语句块,都可以省略花括号。许多程序员都认为最好在任何情况下都加上花括号。

3. dowhile循环

do...while循环是while循环的后测试版本。它与C++Java中的do...while循环相同,与VB中的Loop...While循环相同,该循环的测试条件要在执行完循环体之后执行。因此do...while循环适合于至少执行一次循环体的情况:

bool condition;

do

{

   // this loop will at least execute once, even if Condition is false

   MustBeCalledAtLeastOnce();

   condition = CheckCondition();

} while (condition);

4. foreach循环

foreach循环是我们讨论的最后一种C#循环机制。其他循环机制都是CC++的最早期版本,而foreach语句是新增的循环机制(借用于VB),也是非常受欢迎的一种循环。

foreach循环可以迭代集合中的每一项。现在不必考虑集合的概念,第9章将介绍集合。知道集合是一种包含其他对象的对象即可。从技术上看,要使用集合对象,它必须支持IEnumerable接口。集合的例子有C#数组、System.Collection命名空间中的集合类,以及用户定义的集合类。从下面的代码中可以了解foreach循环的语法,其中假定arrayOfInts是一个整型数组:

foreach (int temp in arrayOfInts)

{

   Console.WriteLine(temp);

}

其中,foreach循环每次迭代数组中的一个元素。它把每个元素的值放在int型的变量temp中,然后执行一次循环迭代。

注意,不能改变集合中各项(上面的temp)的值,所以下面的代码不会编译:

foreach (int temp in arrayOfInts)

{

   temp++;

   Console.WriteLine(temp);

}

如果需要迭代集合中的各项,并改变它们的值,就应使用for循环。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论