开关盒内部有条件断开

时间:2012-03-14 15:15:49

标签: c#

我想知道是否有可能在C#中的switch语句中有条件地突破一个案例。以下面的例子为例。

MediaStream photoMediaStream = null;
switch (photoSize)
{
    case PhotoSize.Normal:
        if (imageWidth >= NormalWidth && imageWidth % NormalWidth == 0)
        {
            photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = NormalWidth});
            break;
        }
    case PhotoSize.Small:
        if (imageWidth >= SmallWidth && imageWidth % SmallWidth == 0)
        {
            photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = SmallWidth});
            break;
        }
    case PhotoSize.Thumb:
        if (imageWidth >= ThumbWidth && imageWidth % ThumbWidth == 0)
        {
            photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = ThumbWidth});
            break;
        }
}

基本上,如果条件为真,我想做一些事情,然后突破switch语句,但如果不是,我只想进入下一个案例。

8 个答案:

答案 0 :(得分:7)

由于您不能隐式地涉及下一个案例,因此必须使用goto语句明确地执行此操作。这是使用此声明的极少数情况之一......

MediaStream photoMediaStream = null;
switch (photoSize)
{
    case PhotoSize.Normal:
        if (imageWidth >= NormalWidth && imageWidth % NormalWidth == 0)
        {
            photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = NormalWidth});
            break;
        }
        goto case PhotoSize.Small;
    case PhotoSize.Small:
        if (imageWidth >= SmallWidth && imageWidth % SmallWidth == 0)
        {
            photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = SmallWidth});
            break;
        }
        goto case PhotoSize.Thumb;
    case PhotoSize.Thumb:
        if (imageWidth >= ThumbWidth && imageWidth % ThumbWidth == 0)
        {
            photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = ThumbWidth});
            break;
        }
}

无论如何,使用if语句重构它可能会更好:

MediaStream GetPhotoMediaStream(PhotoSize photoSize, /* whatever parameters you need... */)
{
    if (photoSize == PhotoSize.Normal)
    {
        if (imageWidth >= NormalWidth && imageWidth % NormalWidth == 0)
        {
            return photoMedia.GetStream(new MediaOptions {Width = NormalWidth});
        }
        photoSize = PhotoSize.Small;
    }
    if (photoSize == PhotoSize.Small)
    {
        if (imageWidth >= SmallWidth && imageWidth % SmallWidth == 0)
        {
            return photoMedia.GetStream(new MediaOptions {Width = SmallWidth});
        }
        photoSize = PhotoSize.Thumb;
    }
    if (photoSize == PhotoSize.Thumb)
    {
        if (imageWidth >= ThumbWidth && imageWidth % ThumbWidth == 0)
        {
            return photoMedia.GetStream(new MediaOptions {Width = ThumbWidth});
        }
    }
    return null;
}

答案 1 :(得分:2)

不,C#不允许在交换机中出现问题,除非案例之间没有代码。 参见C#规范的第8.7.2节:

  

如果可以访问switch部分的语句列表的结束点,则会发生编译时错误。

答案 2 :(得分:2)

您可以使用goto case转到其他案例。

switch (photoSize)
{
    case PhotoSize.Normal:
        if (imageWidth >= NormalWidth && imageWidth % NormalWidth == 0)
        {
            photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = NormalWidth});
            break;
        }
        goto case PhotoSize.Small;
    case PhotoSize.Small:
        if (imageWidth >= SmallWidth && imageWidth % SmallWidth == 0)
        {
            photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = SmallWidth});
            break;
        }
        goto case PhotoSize.Thumb;
    case PhotoSize.Thumb:
        if (imageWidth >= ThumbWidth && imageWidth % ThumbWidth == 0)
        {
            photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = ThumbWidth});
            break;
        }
        break;
    }

答案 3 :(得分:1)

当中间有任何代码时,C#不支持通过案例标签掉落(请参阅Switch statement fallthrough in C#?) 因此,你肯定可以有条件地打破 - 但是,无论如何你也必须在每个街区的末尾打破; - )

只需使用一些ifs。

答案 4 :(得分:1)

不,这是不可能'因为if条件不满足程序应该从一个案例流到下一个案例(这在C#中是不允许的)。

来自MSDN

  

在所选部分中执行语句列表以。开头   通常是第一个语句并通过语句列表继续   直到达到跳转语句,例如中断,转到大小写,   返回,或抛出。那时,控制权转移到了外面   切换声明或另一个案例标签。

     

与C ++不同, C#不允许从一个交换机继续执行   部分到下一个

答案 5 :(得分:0)

好吧,如果您需要在函数中执行代码,请不要使用switch/case,而应使用if语句链。在您想要“中断”执行流程的那一刻,请使用return

答案 6 :(得分:0)

正如其他人所说,C#不允许堕落。它确实允许堆叠案件,但这对你没有帮助。但是,您可以使用if条件之外的goto语句将控制权明确地转移到另一个(或者在您的情况下,下一个)案例中。

在有人说'OMG !!之前eww ... goto!',我必须补充说,很少有案例可以保证使用gotos。这似乎是其中之一。只要不被误用,就没有任何内在错误。

答案 7 :(得分:0)

将“break”放在If条件之外..

MediaStream photoMediaStream = null;
switch (photoSize)
{
   case PhotoSize.Normal:
    if (imageWidth >= NormalWidth && imageWidth % NormalWidth == 0)
    {
        photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = NormalWidth});

    }
 break;
 case PhotoSize.Small:
    if (imageWidth >= SmallWidth && imageWidth % SmallWidth == 0)
    {
        photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = SmallWidth});

    }
break;
case PhotoSize.Thumb:
    if (imageWidth >= ThumbWidth && imageWidth % ThumbWidth == 0)
    {
        photoMediaStream = photoMedia.GetStream(new MediaOptions {Width = ThumbWidth});

    }
break;
 }