我想知道是否有可能在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语句,但如果不是,我只想进入下一个案例。
答案 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;
}