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
ori++
- 递减前缀或递减后缀,比如,
--i
ori--
- 赋值
- 方法的调用
- await表达式
- 通过使用 new 运算符来创建对象
8.foreach迭代
foreach
语句迭代实现了 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<T>接口的类型的实例。
foreach
语句还可以迭代满足以下条件的任何类型的实例:
- 类型具有
public
无参数的GetEnumerator
方法(可以是类型的扩展方法),GetEnumerator
方法的返回值具有public
的Current
属性。 - 类型具有
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