开放的编程资料库

当前位置:我爱分享网 > C#教程 > 正文

C# 流控制

在本文中,我们将讨论C#中的流控制。我们定义了几个关键字,使我们能够控制C#程序的流程。

C#程序运行时,代码是从上到下执行的。程序的流程可以用各种关键字来改变,包括if/else、for、while和switch。

控制流结构可用于有条件地或多次地执行代码。

C#if语句

if语句具有以下一般形式:

if (expression)
{
    statement;
}

if关键字用于检查表达式是否为真。如果为真,则执行一条语句。该语句可以是单个语句或复合语句。复合语句由块包围的多个语句组成。块是用大括号括起来的代码。

var r = new Random();
int n = r.Next(-5, 5);

Console.WriteLine(n);

if (n > 0)
{
    Console.WriteLine("The n variable is positive");
}
 

生成一个随机数。如果数字大于零,我们会向终端打印一条消息。

var r = new Random();
int n = r.Next(-5, 5);

这两行生成一个介于-5..5之间的随机整数。

if (n > 0)
{
    Console.WriteLine("The n variable is positive");
}

使用if关键字,我们检查生成的数字是否大于零。if关键字后跟一对圆括号。在括号内,我们放置了一个表达式。该表达式产生一个布尔值。如果布尔值为真,则执行两个大括号括起来的块。在我们的例子中,字符串“Thenvariableispositive”被打印到终端。如果随机值为负,什么都不做。如果我们只有一个表达式,大括号是可选的。

$ dotnet run
-3
$ dotnet run
-4
$ dotnet run
-1
$ dotnet run
1
The n variable is positive

当满足条件时,消息将写入控制台。

C#else语句

我们可以使用else关键字来创建一个简单的分支。如果if关键字后面的方括号内的表达式计算结果为false,则后面的语句>else关键字自动执行。

var r = new Random();
int n = r.Next(-5, 5);

Console.WriteLine(n);

if (n > 0)
{
    Console.WriteLine("The number is positive");
} else
{
    Console.WriteLine("The number is negative");
}

要么执行if关键字之后的块,要么执行else关键字之后的块。

if (n > 0)
{
    Console.WriteLine("The number is positive");
} else
{
    Console.WriteLine("The number is negative");
}

else关键字跟在if块的右大括号之后。它有自己的块,用一对大括号括起来。

$ dotnet run
-3
The number is negative
$ dotnet run
-1
The number is negative
$ dotnet run
2
The number is positive

我们执行程序三次。

C#elseif

我们可以使用elseif关键字创建多个分支。elseif关键字测试另一个条件当且仅当不满足先前条件时。请注意,我们可以在测试中使用多个elseif关键字。

var r = new Random();
int n = r.Next(-5, 5);

Console.WriteLine(n);

if (n < 0)
{
    Console.WriteLine("The n variable is negative");
} else if (n == 0)
{
    Console.WriteLine("The n variable is zero");

} else
{
    Console.WriteLine("The n variable is positive");
}

之前的程序有一个小问题。零被赋予负值。以下程序将解决此问题。

if (n < 0)
{
    Console.WriteLine("The n variable is negative");
} else if (n == 0)
{
    Console.WriteLine("The n variable is zero");
} else
{
    Console.WriteLine("The n variable is positive");
}

如果第一个条件的计算结果为真,例如输入的值小于零,执行第一个块并跳过其余两个块。如果不满足第一个条件,则检查ifelse关键字之后的第二个条件。如果第二个条件的计算结果为真,则执行第二个块。如果不是,则执行else关键字之后的第三个块。如果不满足先前的条件,则始终执行else块。

$ dotnet run
-1
The n variable is negative
$ dotnet run
4
The n variable is positive
$ dotnet run
1
The n variable is positive
$ dotnet run
0
The n variable is zero

我们执行程序三次。0被正确处理。

C#switch语句

switch语句是一个选择控制流语句。它允许变量或表达式的值通过多路分支控制程序执行的流程。它以比使用if/elseif/else语句的组合更简单的方式创建多个分支。

我们有一个变量或一个表达式。switch关键字用于根据值列表测试变量或表达式中的值。值列表使用case关键字显示。如果值匹配,执行case之后的语句。有一个可选的default语句。如果没有找到其他匹配项,则执行。

从C#7.0开始,匹配表达式可以是任何非空表达式。

选择星期几

在下面的示例中,我们使用switch语句选择星期几。

var dayOfWeek = DateTime.Now.DayOfWeek;

switch (dayOfWeek)
{
    case DayOfWeek.Sunday:
        Console.WriteLine("dies Solis");
        break;

    case DayOfWeek.Monday:
        Console.WriteLine("dies Lunae");
        break;

    case DayOfWeek.Tuesday:
        Console.WriteLine("dies Martis");
        break;

    case DayOfWeek.Wednesday:
        Console.WriteLine("dies Mercurii");
        break;

    case DayOfWeek.Thursday:
        Console.WriteLine("dies Jovis");
        break;

    case DayOfWeek.Friday:
        Console.WriteLine("dies Veneris");
        break;

    case DayOfWeek.Saturday:
        Console.WriteLine("dies Saturni");
        break;
}

该示例确定星期几并打印其对应的拉丁语。

switch (dayOfWeek)
{
    ...
}

在圆括号中,switch关键字从表达式中获取一个值,该表达式将被测试。switch关键字的主体放在一对或大括号内。在正文中,我们可以放置多个case选项。每个选项都以break关键字结束。

case DayOfWeek.Sunday:
    Console.WriteLine("dies Solis");
    break;

使用case语句,我们测试匹配表达式的值。如果它等于DayOfWeek.Sunday,我们打印拉丁文diesSolis

$ dotnet run
dies Solis

程序在周日运行。

选择域

要求用户输入域名。域名被读取并存储在一个变量中。该变量使用switch关键字针对选项列表进行测试。

Console.Write("Enter a domain name: ");

string domain = Console.ReadLine();

domain = domain.Trim().ToLower();

switch (domain)
{
    case "us":
        Console.WriteLine("United States");
    break;

    case "de":
        Console.WriteLine("Germany");
    break;

    case "sk":
        Console.WriteLine("Slovakia");
    break;

    case "hu":
        Console.WriteLine("Hungary");
    break;

    default:
        Console.WriteLine("Unknown");
    break;
}

在我们的程序中,我们有一个domain变量。我们从命令行读取变量的值。我们使用case语句来测试变量的值。有几种选择。例如,如果值等于“us”,则“UnitedStates”字符串将打印到控制台。

string domain = Console.ReadLine();

从控制台读取用户的输入。

domain = domain.Trim().ToLower();

Trim方法从潜在的前导和尾随空格中去除变量。ToLower将字符转换为小写。现在“us”、“US”、“us”是us域名的可行选择。

case "us":
    Console.WriteLine("United States");
break;

在这种情况下,我们测试域变量是否等于“us”字符串。如果为真,我们将向控制台打印一条消息。该选项以break关键字结束。如果成功评估了其中一个选项,则break关键字终止switch块。

default:
    Console.WriteLine("Unknown");
break;

default关键字是可选的。如果没有评估任何case选项,则执行default部分。

$ dotnet run
Enter a domain name: us
United States

$ dotnet run
Enter a domain name: HU
Hungary

$ dotnet run
Enter a domain name: pl
Unknown

使用when语句

case语句可以与when语句一起使用来指定附加条件。

Console.Write("Enter your age: ");

var input = Console.ReadLine();

var age = Int32.Parse(input.Trim());

switch (age)
{
    case var myAge when myAge < 0:
        Console.WriteLine("Age cannot be a negative value");
    break;

    case var myAge when myAge > 130:
        Console.WriteLine("This is an unlikely high age");
    break;

    default:
        Console.WriteLine("The entered age is {0}", age);
    break;
}

在程序中,要求用户输入他的年龄。

case var myAge when myAge < 0:
    Console.WriteLine("Age cannot be a negative value");
break;

借助when表达式,我们测试输入的值是否小于0。使用var关键字,我们创建一个临时的myAge变量。

使用枚举作为匹配表达式

对于匹配表达式,我们可以使用任何类型。在下面的示例中,我们使用枚举。

var color = (Color) (new Random()).Next(0, 7);

switch (color)
{
    case Color.Red:
        Console.WriteLine("The color is red");
        break;

    case Color.Green:
        Console.WriteLine("The color is green");
        break;

    case Color.Blue:
        Console.WriteLine("The color is blue");
        break;

    case Color.Brown:
        Console.WriteLine("The color is brown");
        break;

    case Color.Yellow:
        Console.WriteLine("The color is yellow");
        break;

    case Color.Pink:
        Console.WriteLine("The color is pink");
        break;

    case Color.Orange:
        Console.WriteLine("The color is orange");
        break;

    default:
        Console.WriteLine("The color is unknown.");
        break;
}

enum Color { Red, Green, Blue, Brown, Yellow, Pink, Orange }

该示例随机生成一个颜色枚举。swith语句确定生成哪个颜色值。

$ dotnet run
The color is orange

$ dotnet run
The color is blue

$ dotnet run
The color is brown

我们运行程序。

切换表达式

Switch表达式使switch语句的语法更加简洁。它们是在C#8.0中引入的。

Console.Write("Enter a domain name: ");

string domain = Console.ReadLine();

domain = domain.Trim().ToLower();

string result = domain switch
{
    "us" => "United States",
    "de" => "Germany",
    "sk" => "Slovakia",
    "hu" => "Hungary",

    _ => "Unknown"
};

Console.WriteLine(result);

变量出现在switch关键字之前。case:元素替换为=>default大小写替换为_丢弃。正文是表达式,而不是语句。

C#while语句

while语句是一种控制流语句,允许根据给定的布尔条件重复执行代码。

while (expression)
{
    statement;
}

while关键字执行大括号括起来的块内的语句。每次表达式被计算为true时都会执行这些语句。

int i = 0;
int sum = 0;

while (i < 10)
{
    i++;
    sum += i;
}

Console.WriteLine(sum);

在代码示例中,我们计算一系列数字的值之和。

while循环包含三个部分。初始化、测试和更新。语句的每一次执行称为一个循环。

int i = 0;

我们启动i变量。它用作计数器。

while (i < 10)
{
   ...
}

while关键字后面的圆括号内的表达式是第二阶段,测试。执行正文中的语句,直到表达式被评估为false。

i++;

这是while循环的最后一个第三阶段,即更新。我们增加计数器。请注意,while循环处理不当可能会导致无限循环。

do-while语句

可以至少运行一次该语句。即使不满足条件。为此,我们可以使用dowhile关键字。

int count = 0;

do {
    Console.WriteLine(count);
} while (count != 0);

首先执行块,然后计算真值表达式。在我们的例子中,条件不满足,dowhile语句终止。

C#for语句

在开始循环之前知道循环次数后,我们可以使用for语句。在这个结构中,我们声明了一个计数器变量,它在每次循环重复期间自动增加或减少值。

简单的for循环

for循环包含三个阶段:初始化、条件和代码块执行以及递增。

for (int i=0; i<10; i++)
{
    Console.WriteLine(i);
}

在此示例中,我们将数字0..9打印到控制台。

for (int i=0; i<9; i++)
{
    Console.WriteLine(i);
}

分为三个阶段。在第一阶段,我们将计数器i初始化为零。这个阶段只进行一次。接下来是条件。如果满足条件,则执行for块内的语句。在第三阶段,计数器增加。现在我们重复2、3阶段,直到不满足条件,离开for循环。在我们的例子中,当计数器i等于10时,for循环停止执行。

for循环数组遍历

for循环可用于遍历数组。从数组的Length属性我们知道数组的大小。

string[] planets = { "Mercury", "Venus", "Earth",
    "Mars", "Jupiter", "Saturn", "Uranus", "Pluto" };

for (int i = 0; i < planets.Length; i++)
{
    Console.WriteLine(planets[i]);
}

Console.WriteLine("In reverse:");

for (int i = planets.Length - 1; i >= 0; i--)
{
    Console.WriteLine(planets[i]);
}

我们有一个数组,其中包含太阳系中行星的名称。使用两个forloop,我们按升序和降序打印值。

for (int i = 0; i < planets.Length; i++)
{
    Console.WriteLine(planets[i]);
}

数组通过从零开始的索引访问。第一项的索引为0。因此,i变量被初始化为零。条件检查i变量是否小于数组的长度。在最后阶段,i变量递增。

for (int i = planets.Length - 1; i >= 0; i--)
{
    Console.WriteLine(planets[i]);
}

这个for循环以相反的顺序打印数组的元素。i计数器被初始化为数组大小。由于索引是从零开始的,因此最后一个元素的索引数组大小为1。该条件确保计数器大于或等于零。(数组索引不能为负数)。在第三步中,i计数器减一。

for循环中的更多表达式

在for循环的初始化和迭代阶段可以放置更多的表达式。

var r = new Random();
var values = new int[10];

int sum = 0;
int num = 0;

for (int i = 0; i < 10; i++, sum += num)
{
    num = r.Next(10);
    values[i] = num;
}

Console.WriteLine(string.Join(",", values));
Console.WriteLine("The sum of the values is {0}", sum);

在我们的示例中,我们创建了一个包含十个随机数的数组。计算出这些数字的总和。

for (int i = 0; i < 10; i++, sum += num)
{
    num = r.Next(10);
    values[i] = num;
}

在for循环的第三部分,我们有两个用逗号分隔的表达式。i计数器递增,当前数字被添加到sum变量。

Console.WriteLine(string.Join(",", values));

使用System.String类的Join方法,我们一次性打印数组的所有值。它们将由逗号分隔。

$ dotnet run
9,3,1,7,9,8,5,6,3,3
The sum of the values is 54

嵌套for循环

For语句可以嵌套;即一个for语句可以放在另一个for语句中。嵌套for循环的所有循环都针对外部for循环的每个循环执行。

var a1 = new string[] { "A", "B", "C" };
var a2 = new string[] { "A", "B", "C" };

for (int i=0; i<a1.Length; i++)
{
    for (int j=0; j<a2.Length; j++)
    {
        Console.WriteLine(a1[i] + a2[j]);
    }
}

在这个例子中,我们创建了两个数组的笛卡尔积。

var a1 = new string[] { "A", "B", "C" };
var a2 = new string[] { "A", "B", "C" };

我们有两个数组。每个数组都有树字母。Caresian产品是当一个数组中的每个元素与另一个数组中的所有元素配对时。为此,我们使用嵌套的for循环。

for (int i=0; i<a1.Length; i++)
{
    for (int j=0; j<a2.Length; j++)
    {
        Console.WriteLine(a1[i] + a2[j]);
    }
}

在另一个父for循环中有一个嵌套的for循环。nestedfor循环针对父for循环的每个循环完全执行。

$ dotnet run
AA
AB
AC
BA
BB
BC
CA
CB
CC

C#foreach语句

foreach构造简化了遍历数据的过度收集。它没有明确的计数器。foreach语句逐个遍历数组或集合,并将当前值复制到构造中定义的变量。

string[] planets = { "Mercury", "Venus", "Earth", "Mars", "Jupiter", 
    "Saturn", "Uranus", "Neptune" };

foreach (string planet in planets)
{
    Console.WriteLine(planet);
}

在此示例中,我们使用foreach语句遍历行星数组。

foreach (string planet in planets)
{
    Console.WriteLine(planet);
}

foreach语句的用法很简单。planets是我们迭代的数组。planet是一个临时变量,它具有数组中的当前值。foreach语句遍历所有行星并将它们打印到控制台。

$ dotnet run
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune

C#中断语句

break语句可用于终止由whileforswitch语句定义的块。

var random = new Random();

while (true)
{
    int num = random.Next(1, 30);
    Console.Write("{0} ", num);

    if (num == 22)
    {
        break;
    }
}

Console.Write('\n');

我们定义了一个无限的while循环。我们使用break语句来跳出这个循环。我们从1到30中选择一个随机值。我们打印该值。如果该值等于22,我们将结束无尽的while循环。

$ dotnet run
18 3 21 26 12 27 23 25 2 21 15 4 18 12 24 13 7 19 10 26 5 22

C#continue语句

continue语句用于跳过循环的一部分并继续循环的下一次迭代。它可以与forwhile语句结合使用。

在下面的例子中,我们打印了一个不能被2整除的数字列表(赔率)。

int num = 0;

while (num < 1000)
{
    num++;

    if (num % 2 == 0)
    {
        continue;
    }

    Console.Write($"{num} ");
}

Console.Write('\n');

我们使用while循环遍历数字1..999。

if (num % 2 == 0)
{
    continue;
}

如果表达式num%2返回0,则所讨论的数字可以除以2。执行continue语句并跳过循环的其余部分。在我们的例子中,循环的最后一条语句被跳过并且数字没有打印到控制台。下一次迭代开始。

在本文中,我们介绍了C#控制流结构。

列出所有C#教程。

未经允许不得转载:我爱分享网 » C# 流控制

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏