Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#标签的优点和型号用途是什么 重复:_C#_.net - Fatal编程技术网

C#标签的优点和型号用途是什么 重复:

C#标签的优点和型号用途是什么 重复:,c#,.net,C#,.net,我在使用reflector浏览一些.NET源代码时,遇到了一些我在web上很少看到的东西,即标签语法 从这里我可以看出,这增加了丑陋的意大利面代码的可能性: goto 1: goto 2: if(booleanProperty) goto 1: 标签的用途是否只是为了让您可以跳回函数中的第四个 您认为C#标签的型号用途是什么?您是否有自己的实施经验?这是不是一次很好的经历 if (1 == 1) goto Stage2; Stage1: Console.WriteLine(

我在使用reflector浏览一些.NET源代码时,遇到了一些我在web上很少看到的东西,即标签语法

从这里我可以看出,这增加了丑陋的意大利面代码的可能性:

goto 1: 
goto 2: 
if(booleanProperty) goto 1:
标签的用途是否只是为了让您可以跳回函数中的第四个

您认为C#标签的型号用途是什么?您是否有自己的实施经验?这是不是一次很好的经历

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

后藤很有争议。然而,您遇到的代码可能是从可读性更高的c#源代码重构为与IL结构更紧密一致的标签和分支。

Goto是极具争议的。然而,您遇到的代码可能是从可读性更高的c#源代码重构成与IL结构更紧密一致的标签和分支。

有一些情况-通常在表示状态机的自动生成代码中,
goto
可以使生活更简单。如果你想得够仔细的话,通常会有一种解决方法,但是对于自动生成的代码来说,找到一种简单但可读性较差的方法要比尝试手工生成代码容易得多


不能说我自己在C#中使用过它,但IIRC在将巨大的洞穴探险移植到Java时做了类似的事情。

有一些情况-通常是在表示状态机的自动生成代码中,
goto
可以使生活更简单。如果你想得够仔细的话,通常会有一种解决方法,但是对于自动生成的代码来说,找到一种简单但可读性较差的方法要比尝试手工生成代码容易得多


不能说我自己在C#中使用过它,但IIRC在将《巨大的洞穴探险》移植到Java时做了类似的事情。

我发现标签/goto语法在C#中唯一有用的一次是在实现fall-through in-case语句时。这是我发现Java中偶尔有用的东西,但C#不允许。否则,我会像瘟疫一样避免使用标签和goto。

我发现标签/goto语法在C#中唯一有用的时候是在实现case语句时。这是我发现Java中偶尔有用的东西,但C#不允许。否则我会避免使用标签,然后像瘟疫一样跳转。

你经常在reflector中看到这一点,因为程序员使用了在幕后重新编写的更高级别的构造,所以我们现在看到的是跳转/标签


当考虑是否作为程序员使用标签时,我的经验法则是,如果你不得不问,你可能不应该这样做。

你经常在reflector中看到这一点,因为程序员使用了在幕后重新编写的更高级构造,所以我们现在看到的是goto/labels


在考虑是否作为程序员使用标签时,我的经验法则是,如果你不得不问,你可能不应该这样做。

考虑到goto的各种用法,请始终避免使用意大利面代码,以及前面回答中的所有建议:

    while (loop1) {
    while (loop2) {
        if (timeToQuit) 
            break outerLabel;
    }
}
outerLabel:
在开关中

switch(value) {
    case 1:
        // DoSomething();
        break;
    case 2:
        // DoSomethingElse();
        break;
    default:
        goto case 1;
}

goto有多种用法,考虑到,始终避免使用意大利面代码,以及之前回复中的所有建议:

    while (loop1) {
    while (loop2) {
        if (timeToQuit) 
            break outerLabel;
    }
}
outerLabel:
在开关中

switch(value) {
    case 1:
        // DoSomething();
        break;
    case 2:
        // DoSomethingElse();
        break;
    default:
        goto case 1;
}
福利:工作保障?--因为它真的会让别人看不懂你的代码

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

好处:工作安全?--因为它真的会让别人看不懂你的代码


用法模式:无,除非另一个选项更糟糕,几分钟前问:哈哈,我和这个问题的另一位作者肯定有一些共同的话题在讨论——讽刺的是,我说我在网上看到的很少,现在一个小时内就有两个关于in的问题。疯狂。可能是一个关于为什么后藤不好的报告作业?几分钟前被问到:哈哈,我和这个问题的另一位作者肯定有一些共同的话题在讨论——讽刺的是,我说我在网上看到的很少,现在有两个问题在一个小时内相互关联。疯狂。可能是关于为什么goto不好的报告分配?不是编译器重新编写它来使用goto。Gotos和循环都编译为相同的分支指令。反编译器是否能够完全理解这一点,决定了您在Reflector中看到的是原始构造还是不同的东西。例如,如果我写“int I=0;\n StartOOP:\n if(I>=100)goto EndLoop;\n Console.WriteLine(I);\n I=I+1;\n goto StartOOP;\n EndLoop:”,编译并反射它,我看到了“for”(int i=0;i<100;i++)Console.WriteLine(i);“不是编译器重新编写它以使用gotos。gotos和循环都编译到相同的分支指令。而是反编译器是否能够完全理解这一切,这决定了您在Reflector中看到的是原始构造还是不同的东西。例如,如果我编写“int i=0;\n STARTOOP:\n如果(i>=100)转到EndLoop;\n Console.WriteLine(i);\n i=i+1;\n转到STARTOOP;\n EndLoop:”,编译并反射它,我看到“对于(int i=0;i<100;i++)Console.WriteLine(i);”