刚开始接触编程的时候是从C语言入门,当时老师提到过goto语句的危害,后来也就一直没有用到过goto语法;直到这两天看到一份别人写的代码如下:
//部分代码
int tryCount = 3; //至多3次重传机会
//Send command
tt: commPort.Write(commandByte, 0, command.Count);
DelegateState.InvokeDispatchStateEvent(BitConverter.ToString(commandByte), Color.Black);
System.Threading.Thread.Sleep(500);
//check command
byte[] buffer = new byte[500];
try
{
commPort.Read(buffer, 0, 500);
}
catch (Exception e)
{
tryCount--;
if (tryCount > 0)
goto tt;
else
{
DelegateState.InvokeDispatchStateEvent("communication error", Color.Red);
return false;
}
}
当时看到tt: commPort.Write(commandByte, 0, command.Count);
这行竟然没看懂这个tt是什么意思。直到后面看到了goto;
;当时觉得很不可思议,竟然有人还在用goto语法,于是在技术群里面与各位大神讨论了下;有人说现在高级语言完全不需要,用这个goto语句没被炒鱿鱼吗;有人说存在即合理。一番讨论后得到下面几个结论:
1.尽量不要使用goto语法,在调试的时候真的很不方便。
2.goto语句有他的便捷性,比如在多层潜逃循环中,可以使用goto语法快速跳出循环。
延伸
跨线程使用goto语句会怎样,比如下面这段代吗:
static void Main(string[] args)
{
Task.Factory.StartNew(() => {
Task.Delay(5000).ContinueWith((o) => {
goto tt;
});
});
tt: DateTime dt = new DateTime(2000,01,1);
string s= dt.ToString("yyyyMMdd");
}
其实这段代码不会被编译通过,由此可见,goto作用范围只能是在同一个执行过程中。