dotNETcsharp

C# Learning:跳转语句

2020-04-01  本文已影响0人  月银秋

throw语句和yield语句也可以算作跳转语句,但前者也可以归为异常处理语句,届时再谈;后者相对复杂,可以在学习linq相关内容时了解。

break

break语句可以配合迭代语句使用,终止其所在的最接近的循环,或配合switch语句使用,以离开switch语句。关于离开switch语句,可以见我的另一篇文章《C# Learning:选择语句》
所谓其所在的最接近的循环,官方文档原文为“the closest enclosing loop”。这是在循环嵌套的时候需要的一个说明。也就是说按照如下代码:

for(; ; ) // 循环A
{
    while(true) // 循环B
    {
        break;
    }
}

break将跳出更接近它的循环B,而不是跳出循环A;而如下代码:

for(; ; ) // 循环A
{
    while(true) ; // 循环B
    break;
}

此处break将跳出循环A(如果能执行到的话),因为它不在循环B内。
在使用break跳出for循环时,for循环的第三项不会被执行。也就是说如下代码将:

A
for(B; C; D)
{
    E
    break;
}
F

依次执行A、B、C(并判断)、E、F。同时此时Visual Studio会产生一个警告,说D不会被执行。

continue

continue语句只能配合迭代语句使用,进入下一次迭代。
continue语句不会导致迭代语句的条件部分(如for循环的第二项)失效,也不会使for循环的第三项失效,也就是说:

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

此段代码之会打印出一行0。

goto

goto语句需要配合标记使用,可以直接把控制权传向某个标记。
一般来说goto被用来传递至某个switch语句中的某个标签,或者是跳出深嵌套循环。比如:

string str = Console.ReadLine();
switch(str)
{
    case "Hello!":
        Console.WriteLine("Hi!");
        goto case "What's your name?";

    case "What's your name?":
        Console.WriteLine("My name is ROBOT. How about you?");
        break;
}


for (; ; )
    while (true)
        do { goto End; } while (true);
End:
;

上方代码演示了跳转到switch语句中的某个标签;而下方的代码演示了跳出多重循环,以及若某个标签后没有语句的处理方式(使用空语句“;”)。此时若输入“Hello!”,则会输出:

Hi!
My name is ROBOT. How about you?

return

return语句用于退出一个方法并给予返回值。方法返回后将控制权转入调用方。

int MethodA()
{
    return MethodB() + 1;
}
int MethodB()
{
    return MethodC() + 1;
}
int MethodC()
{
    return 0;
}

如果方法返回值类型不为void,在所有分支都必须有return语句(或者throw语句),从而提供一个返回值。如果方法返回值类型为void,return语句则是可选的,且其后不需要也不可以跟上任何的值。如:

int MethodA(int a)
{
    if(a >= 0)
    {
        return a;
    }
    // 这个分支(a小于0)没有提供返回值,将引发一个编译错误。
}
void MethodB()
{
    // 这不会引发错误。
}
void MethodC()
{
    return false; // 这同样会引发错误,因为返回类型不匹配(这里不该有返回值)。
}
void MethodD()
{
    return; // 这不会引发错误。
}
上一篇 下一篇

猜你喜欢

热点阅读