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; // 这不会引发错误。
}
网友评论