c# - 开关盒内部的条件中断

标签 c#

我想知道是否可以在 C# 的 switch 语句中有条件地跳出 case。举个例子。

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# - 开关盒内部的条件中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9704728/

相关文章:

c# - 如何将 DataGridView 绑定(bind)到 SQLite 数据库?

c# - 我可以回到线程执行上下文吗?

c# - UInt 抛出 OverflowException

c# - 弯曲并遵循某些路径几何形状的 WPF 动画

c# - 如何在 screwturn wiki 中测试运行插件

c# - 如何从 aspx 页面访问 silverlight 控件的属性和方法?

c# - Dictionary.ContainsKey() 抛出 KeyNotFound 异常

c# - 从代码隐藏中删除事件处理程序

c# - 如何在操作中生成返回 URL?

c# - 解析 Datetime c# 的奇怪结果