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

相关推荐

  • 3.8C#引用类型之集合(Collection)

    与数组最大的区别,集合的长度(元素的个数)可以动态改变,可以向集合添加、删除元素 。 1.集合分类 1.1System.Collections.Generic 类 当集合中的所有元素都具有相同的数据类型时,泛型集合会非常有用。 类 说明 元素的顺序 元素重复的值 Dictionary<TKey,TValue&gt…

    C#语言教程 2021年3月8日
    05820
  • 2.7C#函数成员之事件(Event)

    1.事件委托声明 .NET 类库中的所有事件均基于 EventHandler 委托、EventHandler<TEventArgs> 委托,一般不建议自定义委托。 第一个参数为object类型,表示能够引发事件的类的实例。 第二个参数为从 EventArgs 基类派生的子类型的…

    C#语言教程 2021年2月7日
    04130
  • 2.10C#函数成员之终结器(Finalizer)

    1.终结器声明 终结器(Finalizer),以前称为 析构函数(Destructor),用于在类实例被垃圾回收器回收时执行任何必要的最终清理操作。因此,无法在结构中定义终结器,它们仅用于类。 终结器的声明方式与方法相似,名称为所属类的名称前加~波浪号,不过既不能包含参数和可访问性修饰符,也不能进行显式调用。 2.重载…

    C#语言教程 2021年2月10日
    07550

发表回复

登录后才能评论