当我遇到一些我在网上看不到的东西时,我正在使用反射器搜索一些.NET源代码,这是标签语法。
从这里我可以看到它提出了难看的意大利面条代码的机会:
goto 1:
goto 2:
if(booleanProperty) goto 1:
标签的目的是否只是为了你可以在函数内跳回第四个?
你会说C#标签有哪些型号用途?您是否有自己的实施经验?这是一次好的体验吗?
if (1 == 1)
goto Stage2;
Stage1:
Console.WriteLine("Stage1");
Stage2:
Console.WriteLine("Stage2");
答案 0 :(得分:4)
你最常在反射器中看到这个,因为程序员使用了在幕后重写的更高级别的构造,所以我们现在看到goto / labels。
在考虑是否使用标签作为程序员时,我的经验法则是,如果你不得不问你可能不应该这样做。
答案 1 :(得分:2)
极少数情况 - 通常在代表状态机的自动生成代码中 - goto
可以使生活更简单。如果你认真思考的话,通常会有一种方法,但对于自动生成的代码,更容易找到一种简单但不太可读的方法,而不是尝试生成你手工编写的代码。
不能说我自己在C#中使用过它,但是当我将Colossal Cave冒险移植到Java时,我做了类似的事情。
答案 2 :(得分:1)
后藤极具争议性。但是,您遇到的代码可能会从更易读的c#源代码重构为更符合IL结构的标签和分支。
答案 3 :(得分:1)
我唯一一次在C#中找到有用的标签/ goto语法就是在case语句中实现fall-through时。这是我在Java中偶尔使用的一种C#不允许的东西。否则我会避开标签并像瘟疫那样转向。
答案 4 :(得分:1)
有各种各样的goto用法,考虑到,总是避免意大利面条代码,以及之前回复中的所有建议:
while (loop1) {
while (loop2) {
if (timeToQuit)
break outerLabel;
}
}
outerLabel:
在Switch中
switch(value) {
case 1:
// DoSomething();
break;
case 2:
// DoSomethingElse();
break;
default:
goto case 1;
}
答案 5 :(得分:1)
福利:工作保障? - 因为它真的可以让你的代码对任何人都不可读
使用模式:无,除非替代方案更差