条件、迭代、跳转和异常处理语句

这些语句用于控制程序的执行流程:

  • 条件语句:使用关键字如 ifswitch 根据条件决定是否执行代码。
  • 迭代语句:使用关键字如 dowhileforforeachin 创建循环。
  • 跳转语句:使用关键字如 breakcontinuereturnyield 转移程序控制。

条件语句

条件语句根据条件决定是否执行代码。C# 提供了两种条件语句:if 语句和 switch 语句。

if 语句

C# 中的 if 语句语法与 C、C++ 和 Java 类似。语法如下:

if (condition)
{
  // 执行某些操作
} 
else
{
  // 执行其他操作
}

if 语句通过评估其条件表达式来决定是否执行 if 块的代码。可选的 else 块提供了当条件为 false 时执行的代码。多个 else if 可以串联,形成常见的级联条件结构:

using System;

public class IfStatementSample
{
    public void IfMyNumberIs()
    {
        int myNumber = 5;

        if (myNumber == 4)
            Console.WriteLine("This will not be shown because myNumber is not 4.");
        else if (myNumber < 0)
        {
            Console.WriteLine("This will not be shown because myNumber is not negative.");
        }
        else if (myNumber % 2 == 0)
            Console.WriteLine("This will not be shown because myNumber is not even.");
        else
        {
            Console.WriteLine("myNumber does not match the coded conditions, so this sentence will be shown!");
        }
    }
}

switch 语句

C# 中的 switch 语句与 C、C++ 和 Java 类似,但有一些改进:

  1. 必须以跳转语句结束:每个 case 必须以 breakgotoreturn 结束。C# 不支持从一个 case 语句 "落入" 下一个 case 的行为(从而避免了 C 中常见的意外行为)。
  2. 允许叠加 case:多个 case 可以堆叠,共用一个代码块。
  3. default 是可选的:如果没有匹配的 case 且未定义 default,则默认行为是什么也不做。
  4. 支持字符串switch 变量可以是字符串类型。

简单示例:

switch (nCPU)
{
    case 0:
        Console.WriteLine("You don't have a CPU! :-)");
        break;
    case 1:
        Console.WriteLine("Single processor computer");
        break;
    case 2:
        Console.WriteLine("Dual processor computer");
        break;
        // 叠加 case
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
        Console.WriteLine("A multi processor computer");
        break;
    default:
        Console.WriteLine("A seriously parallel computer");
        break;
}

支持字符串类型的示例:

switch (aircraftIdent)
{
    case "C-FESO":
        Console.WriteLine("Rans S6S Coyote");
        break;
    case "C-GJIS":
        Console.WriteLine("Rans S12XL Airaile");
        break;
    default:
        Console.WriteLine("Unknown aircraft");
        break;
}

迭代语句

 

迭代语句用于创建循环,以执行代码若干次。C# 提供了以下迭代语句:do...while 循环、for 循环、foreach 循环和 while 循环。

 

 

do...while 循环

 

do...while 循环的语法与 C 系语言类似。其形式为:

 
do
{
    // 循环体
} while (条件);
 

特点

 
  • do...while 循环总会先执行一次循环体,然后评估条件表达式。
  • 如果条件为 true,循环体继续执行;如果为 false,循环结束。
 

示例代码:

 
using System;

public class DoWhileLoopSample
{
    public void PrintValuesFromZeroToTen()
    {
        int number = 0;

        do
        {
            Console.WriteLine(number++.ToString());
        } while (number <= 10);
    }
}
 

上述代码将数字 0 到 10 输出到控制台。

 

 

for 循环

 

for 循环的语法与 C 系语言类似。其形式为:

 
for (初始化; 条件; 迭代语句)
{
    // 循环体
}
 

特点

 
  1. 初始化:第一次进入循环时执行,用于声明和初始化变量(通常为索引变量)。
  2. 条件:每次进入循环体前评估条件,若为 true 则继续执行,若为 false 则退出循环。
  3. 迭代语句:每次循环体结束后执行,用于更新变量(如递增或递减索引变量)。
 

示例代码:

 
public class ForLoopSample
{
    public void ForFirst100NaturalNumbers()
    {
        for (int i = 0; i < 100; i++)
        {
            System.Console.WriteLine(i.ToString());
        }
    }
}
 

上述代码将数字 0 到 99 输出到控制台。

 

 

foreach 循环

 

foreach 循环类似于 for 循环,但不需要索引变量。它适用于数组或实现了 IEnumerable 接口的集合。

 

语法

 
foreach (变量声明 in 可枚举表达式)
{
    // 循环体
}
 

特点

 
  • foreach 循环依次获取集合的每个元素,并将其赋值给循环变量。
  • 当没有更多元素时,循环结束。
 

示例代码:

 
public class ForEachSample
{
    public void DoSomethingForEachItem()
    {
        string[] itemsToWrite = { "Alpha", "Bravo", "Charlie" };

        foreach (string item in itemsToWrite)
            System.Console.WriteLine(item);
    }
}
 

上述代码将数组中的 "Alpha""Bravo""Charlie" 输出到控制台。

 

 

while 循环

 

while 循环的语法与 C 系语言类似。其形式为:

 
while (条件)
{
    // 循环体
}
 

特点

 
  • 在每次执行循环体之前,while 循环会评估条件表达式。
  • 如果条件为 true,循环体执行;如果条件为 false,循环结束。
 

示例代码:

 
using System;

public class WhileLoopSample
{
    public void RunForAWhile()
    {
        TimeSpan durationToRun = new TimeSpan(0, 0, 30);
        DateTime start = DateTime.Now;

        while (DateTime.Now - start < durationToRun)
        {
            Console.WriteLine("not finished yet");
        }
        Console.WriteLine("finished");
    }
}
 

上述代码将在 30 秒内不断输出 "not finished yet",然后输出 "finished"

 

 

总结

 
  • do...while 循环:先执行循环体,再评估条件,至少执行一次。
  • for 循环:适用于有计数索引的循环。
  • foreach 循环:适用于遍历数组或集合。
  • while 循环:先评估条件,再决定是否执行循环体。
 

跳转语句

 

跳转语句用于通过关键词如 breakcontinuereturnyieldthrow 转移程序控制。

 

 

break

 

break 语句用于退出 switch 语句中的某个 case,也可以用于退出 forforeachwhiledo...while 循环,将控制转移到循环结束后的第一条语句。

 

示例代码:

 
using System;

namespace JumpSample
{
    public class Entry
    {
        static void Main(string[] args)
        {
            int i;

            for (i = 0; i < 10; i++) // 循环条件 i < 10
            {
                if (i >= 3)
                {
                    break; 
                    // 直接退出循环,后续代码不执行。
                }
            }
            // 此处 i 的值为 3,而不是 10。
            Console.WriteLine("The value of i: {0}", i);
        }
    }
}
 

 

continue

 

continue 语句用于跳过当前循环的剩余代码,将控制转移到循环的下一次迭代。

 

示例代码:

 
using System;

namespace JumpSample
{
    public class Entry
    {
        static void Main(string[] args)
        {
            int counter = 0;

            for (int i = 0; i < 10; i++)
            {
                if (i >= 5)
                {
                    continue;   // 跳过后续代码,直接进入下一次循环。
                }
                counter += 1;
            }
            // counter 的值为 5,而不是 10。
            Console.WriteLine("The value of counter: {0}", counter);
        }
    }
}
 

 

return

 

return 语句用于指定函数或方法的返回值(如果有),并将控制权转移到函数或方法的结束位置。

 

示例代码:

 
namespace JumpSample
{
    public class Entry
    {
        static int Fun()
        {
            int a = 3;
            return a; // 函数在此处终止
            a = 9;    // 此处代码不会执行
        }

        static void Main(string[] args)
        {
            int result = Fun();
            // result 的值为 3,而不是 9。
            Console.WriteLine(result);
        }
    }
}
 

 

yield

 

yield 语句用于定义一个迭代块,该迭代块生成一个枚举器的值,通常用于实现 IEnumerable 接口。

 

语法:

 
yield return expression;
yield break;
 

示例代码:

 
using System;
using System.Collections;

public class YieldSample
{
    public static IEnumerable MyCounter(int stop, int step)
    {
        for (int i = 0; i < stop; i += step)
        {
            yield return i;
        }
    }

    static void Main()
    {
        foreach (int value in MyCounter(10, 2))
        {
            Console.WriteLine(value);
        }
        // 输出:0 2 4 6 8
    }
}
 

 

throw

 

throw 语句用于抛出异常。如果在 try 块中,则控制转移到匹配的 catch 块;否则,会检查调用函数是否包含匹配的 catch 块。如果没有捕获异常,程序将因未处理的异常而终止。

 

示例代码:

 
namespace ExceptionSample
{
    public class Warrior
    {
        private string Name { get; set; }

        public Warrior(string name)
        {
            if (name == "Piccolo")
            {
                throw new Exception("Piccolo can't battle!");
            }
        }
    }

    public class Entry
    {
        static void Main(string[] args)
        {
            try
            {
                Warrior a = new Warrior("Goku");
                Warrior b = new Warrior("Vegeta");
                Warrior c = new Warrior("Piccolo"); // 抛出异常
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}
 

输出:

 
Piccolo can't battle!
 

更多关于异常和 throw 的细节,请参考异常章节。


Last modified: Saturday, 11 January 2025, 9:37 PM