有条件的断开开关盒
我想知道是否有可能在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语句,但如果不是,我只想进入下一个案例。
既然你不能隐含地转向下一个案例,你必须使用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;
}
不,C#不允许在交换机中使用,除非这些情况之间没有代码。 请参阅C#规范的第8.7.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;
}
链接地址: http://www.djcxy.com/p/84491.html
上一篇: Conditional break inside of switch case
下一篇: Is there an easy way to convert a number to a word in PHP?