c#编程
条件、迭代、跳转和异常处理语句
这些语句用于控制程序的执行流程:
- 条件语句:使用关键字如
if
和switch
根据条件决定是否执行代码。 - 迭代语句:使用关键字如
do
、while
、for
、foreach
和in
创建循环。 - 跳转语句:使用关键字如
break
、continue
、return
和yield
转移程序控制。
条件语句
条件语句根据条件决定是否执行代码。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 类似,但有一些改进:
- 必须以跳转语句结束:每个
case
必须以break
、goto
或return
结束。C# 不支持从一个case
语句 "落入" 下一个case
的行为(从而避免了 C 中常见的意外行为)。 - 允许叠加 case:多个
case
可以堆叠,共用一个代码块。 default
是可选的:如果没有匹配的case
且未定义default
,则默认行为是什么也不做。- 支持字符串:
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 (初始化; 条件; 迭代语句)
{
// 循环体
}
特点:
- 初始化:第一次进入循环时执行,用于声明和初始化变量(通常为索引变量)。
- 条件:每次进入循环体前评估条件,若为
true
则继续执行,若为false
则退出循环。 - 迭代语句:每次循环体结束后执行,用于更新变量(如递增或递减索引变量)。
示例代码:
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
循环:先评估条件,再决定是否执行循环体。
跳转语句
跳转语句用于通过关键词如 break
、continue
、return
、yield
和 throw
转移程序控制。
break
break
语句用于退出 switch
语句中的某个 case
,也可以用于退出 for
、foreach
、while
和 do...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
的细节,请参考异常章节。