标签语句
标签语句由一个标识符后面跟一个冒号,再跟一条语句所组成,形式如下:
Identifier : Statement
标签语句在执行时,标签相当于完全不存在,仅仅执行Statement的部分。
- 给语句添加一个标签,允许控制从代码的其他的部分转移到该语句。
- 标签语句只允许用在块内部。
标签
标签有其自己的声明空间,因此,标签语句中的标识符可以是任何有效的标识符,包括那些可能已经在重叠的作用域内声明的标识符(比如本地变量或参数名)。
举个例子:
{
int xyz = 0; //表示变量xyz
...
xyz : Console.Writeline("这样写是可以的!"); //表示标签xyz
}
然而,标签的标识符也是有限制的:
- 不可以是关键字。
- 不可以和在重叠范围内和另一个标签标识符相同。
标签语句的作用域
- 它所声明的块。
- 任何嵌套在该块内的块。
举个例子:
static void main()
{ //作用域A
{ //作用域B
increment: x++
{ //作用域C
{ //作用域D
...
}
{ //作用域E
...
}
}
end: Console.WriteLine("Exiting");
}
}
在上面的这个例子中:
- 在作用域B和所有嵌套块中的代码都可以看到并访问标签语句,即increment和end都在作用域B中。
- 在作用域内部任何位置,代码都可以跳出到标签语句。
- 从外部(例如上面的作用域A)代码都不能跳入标签语句的块。
goto语句
goto语句可以无条件转移控制到一个标签语句。它的形式如下:
goto Identifier;
其中Identifier是标签语句的标识符。
举个例子:
bool thingsAreFine;
while(true)
{
thingsAreFine = GetNuclearReactorCondition();
if(thingsAreFine)
Console.WriteLine("This are fine!");
else
goto NoSoGood;
}
NotSoGood : Console.WriteLine("We have a problem!");
在上面的例子中,goto语句必须在标签语句的作用域内。
- goto语句可以跳到它本身所在块内的任何标签语句,或跳出到任何它被嵌套的块内的标签语句。
- goto语句不能跳入任何嵌套在该语句本身所在块内部的任何块。
不要使用goto语句
使用goto语句是非常坏的习惯,因为它会导致弱结构化的、难以调试和维护的代码。