C# 开关箱中的额外条件(直通?)

C# 开关箱中的额外条件(直通?),c#,C#,我需要在C#中的开关盒中使用一个额外条件。假设我们有几个案例需要做a和B,但是案例4需要C+额外的东西: public void myFunction(int value) { switch(value) { case 0: //Stuff A break; case 1: //Stuff B break; case 2:

我需要在C#中的开关盒中使用一个额外条件。假设我们有几个案例需要做a和B,但是案例4需要C+额外的东西:

public void myFunction(int value)
{
    switch(value)
    {
        case 0:
            //Stuff A
            break;

        case 1:
            //Stuff B
            break;

        case 2:
        case 3:
        case 4:
            //Stuff C

            //Am I forced to use an If to a special condition of case 4?
            if(value == 4)
            {
                //Extra stuff for case 4
            }
            break;  
    }
}

有没有其他不使用If语句的方法呢?

我尝试了一种使用goto的解决方案,它确实有效。谢谢你的回答:

请注意,此解决方案仅适用于在执行语句时不需要具体顺序的情况。


例如,如果在本例中,必须在“stuff C”之后执行“Extra stuff”,正确的方法是在案例3中使用If语句。

我使用goto尝试了一个解决方案,它确实有效。谢谢你的回答:

请注意,此解决方案仅适用于在执行语句时不需要具体顺序的情况。


例如,如果在本例中,必须在“stuff C”之后执行“Extra stuff”,正确的方法是在案例3中使用If语句。

这里有一点奇怪,将本地函数与switch结合起来:

建议编写以下代码:

void Main()
{
    int value = 4;
    switch (value)
    {
        case 0:
            //Stuff A
            break;


        case 1:
            //Stuff B
            break;

        case 2:
        case 3:
            common234(); void common234()
            {
                Console.WriteLine("2-4");
            }
            break;

        case 4:
            common234();
            Console.WriteLine("only 4");
            break;

        //another possible cases...
        case 5:
            //etc 
            break;
    }
}

这里有一点奇怪,将本地功能与开关相结合:

建议编写以下代码:

void Main()
{
    int value = 4;
    switch (value)
    {
        case 0:
            //Stuff A
            break;


        case 1:
            //Stuff B
            break;

        case 2:
        case 3:
            common234(); void common234()
            {
                Console.WriteLine("2-4");
            }
            break;

        case 4:
            common234();
            Console.WriteLine("only 4");
            break;

        //another possible cases...
        case 5:
            //etc 
            break;
    }
}

不确定您正在修复什么问题,但如果您想…提取函数中常见的
内容C
代码,可以使用
开关,在情况2和3中使用,在情况4中使用额外的内容使用。不,在C#中没有办法,开关故障是不允许的。顺便说一句,它应该是
value==4
,而不是
value=4
@patrickhoffman似乎OP希望在这个问题上有一个局部的失误。我不明白为什么在这个问题上会有反对票。这是一个非常合理且清晰的问题,答案并不明显。不确定您正在解决什么问题,但如果您想…提取函数中常见的
代码,可以使用
开关
,在案例2和案例3中使用,在案例4中使用额外的代码。不,在C中没有办法,不允许开关故障。顺便说一句,它应该是
value==4
,而不是
value=4
@patrickhoffman似乎OP希望在这个问题上有一个局部的失误。我不明白为什么在这个问题上会有反对票。这是一个非常合理和清晰的问题,答案并不明显。我不同意帕特里克的建议,永远不要使用
goto
。我们为这种情况添加了“goto case”,因此您应该在这种情况下使用它。也就是说,正如Patrick所建议的,可能有一种方法可以更优雅地编写代码,而不必使用
goto
。举个例子:<代码>开关(value){案例0:填充();中断;案例1:填充();中断;案例2:案例3:填充();中断;案例4:填充();;break;…
这比
goto case
技术更清楚,但它要求逻辑可以提取到方法。如果这对您有效,那么这是一个非常好的解决方案。您需要验证的唯一部分是,在问题的示例中,2-4的通用代码在ca的特殊情况之前执行se 4,在这段代码中,特例代码首先执行。是的,@eric lippert,如果其他人必须查看代码,那么这种方式更清楚,但在我的情况下,不值得将语句提取到方法中,因为它们只有一行长,我想“关联”这两种情况(字符串与asp页面名称).lasse-vågsæther karlsen,是的,我已经意识到了这一点,并在我的解决方案中添加了一个注释,goto可能不适用于所有情况。如果是一行,那么你担心什么?CTRL-C,CTRL-v,完成。我不同意Patrick的建议,永远不要使用
goto
。我们添加了“goto case”正是这种情况,所以这就是你应该使用的情况。正如帕特里克所建议的,可能有一种方法来编写代码更优雅,没有<代码> Goto < /代码>。考虑例如:代码>开关(值){案例0:Studio();中断;案例1:StuffBe();中断;案例2:案例3:StutcU.();();break;…
这比
goto case
技术更清楚,但它要求逻辑可以提取到方法。如果这对您有效,那么这是一个非常好的解决方案。您需要验证的唯一部分是,在问题的示例中,2-4的通用代码在ca的特殊情况之前执行se 4,在这段代码中,特例代码首先执行。是的,@eric lippert,如果其他人必须查看代码,那么这种方式更清楚,但在我的情况下,不值得将语句提取到方法中,因为它们只有一行长,我想“关联”这两种情况(字符串与asp页面名称).lasse-vågsæther karlsen,是的,我已经意识到并在我的解决方案中添加了一个注释,goto可能不适用于所有情况。如果是一行,那么你担心什么?CTRL-C,CTRL-v,完成了。遗憾的是(或者,真的,我真的是幸运的),达夫的设备不能用C#写。悲哀的(或者,真的,我真的是幸运的),Duff的设备无法用C#编写。