C#标签的好处和模型用法是什么?

时间:2009-03-19 15:50:50

标签: c# .net

重复:

  

What is the use of labels in c#?

当我遇到一些我在网上看不到的东西时,我正在使用反射器搜索一些.NET源代码,这是标签语法。

从这里我可以看到它提出了难看的意大利面条代码的机会:

goto 1: 
goto 2: 
if(booleanProperty) goto 1:

标签的目的是否只是为了你可以在函数内跳回第四个?

你会说C#标签有哪些型号用途?您是否有自己的实施经验?这是一次好的体验吗?

if (1 == 1)
    goto Stage2;
Stage1:
    Console.WriteLine("Stage1");
Stage2:
    Console.WriteLine("Stage2");

6 个答案:

答案 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)

福利:工作保障? - 因为它真的可以让你的代码对任何人都不可读

使用模式:无,除非替代方案更差