1.6C#语言的选择(Selection)、迭代(Iteration)、跳转(Jump)语句

1.if选择

if()
{
    //语句;
}

2.if-else选择

if() 
{
    //语句;
} 
else 
{
    //语句;
}

3.if-else-if-else选择

if() 
{
    //语句;
}
else if() 
{
    //语句;
}
else 
{
    //语句
}

4.switch选择

default case 指定匹配表达式与其他任何 case 模式都不匹配时要执行的语句。

通常在每个 switch section末尾使用 break 语句将控制从 switch 语句传递出去。还可使用 return 和 throw 语句将控制从 switch 语句传递出去。 若要模拟贯穿行为,将控制传递给其他 switch section,可使用 goto 语句。

case 模式可能表达力不够,无法详细描述switch section执行的条件。在这种情况下,可以附加 case guard,必须与case 模式同时满足。可以在case 模式后面的 when 关键字之后指定一个 case guard,case guard 必须是布尔表达式。

switch(匹配表达式) 
{
    case 常量表达式1 [when 布尔表达式1]:
        语句1;
        语句2;
        break;
    case 常量表达式N [when 布尔表达式N]:
        语句1;
        语句2;
        break;
    default:
        语句1;
        语句2;
        break;
}

5.while迭代

while 循环会执行零次或多次。

while() 
{
    //语句;
}

6.do-while迭代

先执行do,然后再while,所以 do 循环会执行一次或多次。

do
{
    //语句;
} while();

7.for迭代

for(类型 初始值;条件;迭代) 
{
    //语句;
}
for(var 初始值;条件;迭代) 
{
    //语句;
}

“迭代”部分可包含用逗号分隔的零个或多个以下语句表达式:

  • 递增前缀或递增后缀:比如,++i or i++
  • 递减前缀或递减后缀,比如,--i or i--
  • 赋值
  • 方法的调用
  • await表达式
  • 通过使用 new 运算符来创建对象

8.foreach迭代

foreach语句迭代实现了 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<T>接口的类型的实例。

foreach语句还可以迭代满足以下条件的任何类型的实例:

  • 类型具有public无参数的GetEnumerator方法(可以是类型的扩展方法),GetEnumerator方法的返回值具有publicCurrent属性。
  • 类型具有public的无参数MoveNext方法,MoveNext方法的返回值为bool
foreach(类型 item in 实例) 
{
    //语句;
}
foreach(var item in 实例) 
{
    //语句;
}
//返回值Current属性按引用返回
Span<int> storage = stackalloc int[10];
int num = 0;
foreach (ref int item in storage)
{
    item = num++;
}
foreach (ref readonly var item in storage)
{
    Console.Write($"{item} ");
}
// Output:
// 0 1 2 3 4 5 6 7 8 9

9.yield迭代

类似其它语言的生成器(Generator)。

如果是return语句,程序会将值立即返回给方法的调用方并立即终止方法的往下执行。yield可阻止此终止行为,迭代器中到达 yield return 语句时,会返回一个表达式,并记住当前在代码中的位置,下次调用迭代器时,将从该位置重新开始执行。

迭代器使用 yield return 语句返回集合的每一个元素,每次返回一个元素,所以性能很优异。

在同一方法中不能同时使用 return 语句和 yield return 语句。

//yield语法
yield return 表达式;
//终止迭代
yield break;
public IEnumerable<int> GetSingleDigitNumbers()
{
    yield return 0;
    yield return 1;
    yield return 2;
    yield return 3;
    yield return 4;
    yield return 5;
    yield return 6;
    yield return 7;
    yield return 8;
    yield return 9;
}
//简写
public IEnumerable<int> GetSingleDigitNumbersLoop()
{
    int index = 0;
    while (index < 10)
        yield return index++;
}

10.break跳转

终止包裹break的距离最近的迭代语句或switch语句,控制权将转交给已终止迭代或switch语句后面的语句(若有)。

int[] numbers = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foreach (int number in numbers)
{
    if (number == 3)
    {
        break;
    }

    Console.Write($"{number} ");
}
Console.WriteLine();
Console.WriteLine("End of the example.");
// Output:
// 0 1 2 
// End of the example.

11.continue跳转

跳过包裹continue的距离最近的迭代语句内continue后的剩余语句,控制权会转交给包裹continue的最近的迭代语句的下一个新迭代(若有)。

for (int i = 0; i < 5; i++)
{
    Console.Write($"Iteration {i}: ");
    
    if (i < 3)
    {
        Console.WriteLine("skip");
        continue;
    }
    
    Console.WriteLine("done");
}
// Output:
// Iteration 0: skip
// Iteration 1: skip
// Iteration 2: skip
// Iteration 3: done
// Iteration 4: done

12.labeled和goto跳转

可以为语句指定一个标签,然后使用 goto 关键字将控制权转交到该带有标签的语句。

//labeled语句
标识符 : statement;
//goto语句
//跳出嵌套迭代语句
goto 标识符;
//跳转到switch语句其它case
goto case 常量表达式;
//跳转到switch语句default case
goto default;
static void Main(string[] args) 
{
    int i = 0;
    goto check;
    loop:
    Console.WriteLine(args[i++]);
    check:
    if (i < args.Length) goto loop;
}

13.return跳转

终止return语句所在的函数的执行,并将控制权和函数结果(若有)返回给调用方。

如果函数成员不包含 return 语句,则在执行其最后一个语句后终止。

如果 return 语句具有表达式,该表达式必须可隐式转换为函数成员的返回类型,除非它是async。 对于 async 函数,表达式必须可隐式转换为 Task<TResult> 或 ValueTask<TResult> (函数的返回类型)的类型参数。如果 async 函数的返回类型为 Task 或 ValueTask,则使用不带表达式的 return 语句。

//如果函数成员不计算值,则使用不带表达式的 return 语句。
return;
//如果函数成员计算值,则使用带表达式的 return 语句。
return 表达式;
//返回对变量的引用
return ref

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/7882.html

(0)
上一篇 2021年1月6日 02:35
下一篇 2021年1月6日 23:48

相关推荐

  • 2.9C#函数成员之构造函数(Constructor)

    构造函数的声明方式与方法相似,与所属结构或类同名,不过没有返回类型。 如果没有为结构或类提供实例构造函数,则会隐式自动提供无参数的实例构造函数,这时此结构或类可以被实例化。 不过,如果显式地使用 private 修饰符修饰无参数的空实例构造函数会清楚地表明该类不能被实例化。 1.构造函数分类 名称 …

    C#语言教程 2021年2月9日
    04030
  • 3.12C#类型之记录结构(record struct)和记录类(record class)

    1.记录声明 声明记录结构(值类型)或记录类(引用类型)的语法与声明结构或类的语法相似,可使用位置参数或属性语法声明记录类型。 记录类型可以是不可变类型,也可以是可变类型,但记录类型的发明主要是为创建自定义不可变类型提供简洁的语法。 编译器会为记录的每个位置参数自动创建public自动实现的属性,如果生成的自动实现的属…

    C#语言教程 2021年3月12日
    05540
  • 3.11C#类型之元组(ValueTuple)值类型和元组(Tuple)引用类型

    1.元组声明和初始化 元组提供了简洁的语法来将多个数据元素组合在一个轻型数据结构里。 通过声明 ( 和 ) 之间的成员的类型和名称来实例化元组。 2.访问成员 3.析构(Deconstruct)元组 析构的过程恰恰与元组的声明和初始化相反,析构是将已存在的元组析构成多个单独的变量…

    C#语言教程 2021年3月11日
    05980

发表回复

登录后才能评论