C# 简化 switch 语句

Posted

技术标签:

【中文标题】C# 简化 switch 语句【英文标题】:C# simplify switch statement 【发布时间】:2021-12-03 11:42:12 【问题描述】:

我能否以某种方式简化这个 switch 语句,因为这两种情况只使用另一个函数参数做同样的事情?

switch (data.Subscriber.Protocol)

    case "email json":
        builder.Attachments.Add("Očitanje.json", CraftAttachment(data));
        break;
    case "email text":
        builder.Attachments.Add("Očitanje.txt", CraftAttachment(data));
        break;
    default:
        break;

【问题讨论】:

这能回答你的问题吗? Multiple cases in switch statement 您说“两种情况”,但您确实应该将default 视为单独的情况。所以有 3 个。除非你说“email json”和“email text”是唯一可能的值,我们无法知道。 从 Db 读取协议,有 5 种不同,但我只使用其中 2 种来发送电子邮件。 【参考方案1】:

这样的事情怎么样:

string attachmentName = data.Subscriber.Protocol switch

    "email json" => "Očitanje.json",
    "email text" => "Očitanje.txt",
    _ => null
;

if (attachmentName is not null)

    builder.Attachments.Add(attachmentName, CraftAttachment(data));

Switch expression | C# reference

【讨论】:

有时当有多种解决方案可用时,我会选择大多数程序员都能理解的解决方案,并且根据该指标,您的答案会胜出。【参考方案2】:

//另一种不使用Swtich case的干净方法:

var ProtocolAndFileMappings = new Dictionary<string, string>()
    
       "email json","Očitanje.json",
       "email text","Očitanje.json",
       "email png","Očitanje.png",
       "email Jpeg","Očitanje.Jpeg"
     ;

 builder.Attachments.Add(ProtocolAndFileMappings[data.Subscriber.Protocol], CraftAttachment(data));

【讨论】:

如果 key 不存在,这将抛出。 OP 代码 - 没有。【参考方案3】:

另一种使用本地函数来简化调用的方法:

void add(string s) => if (s != null) builder.Attachments.Add(s, CraftAttachment(data));

add( data.Subscriber.Protocol switch

    "email json" => "Očitanje.json",
    "email text" => "Očitanje.txt",
    _ => null
);

(虽然我认为有些人会批评它“太可爱了......)

注意:此解决方案(与其他解决方案一样)有一个缺点。

代码总是会针对 null 进行额外的测试,而直接的 switch 不会这样做 - 所以这(非常少)效率较低。

我个人会这样做(避免了缺点):

void add(string s) => builder.Attachments.Add(s, CraftAttachment(data));

switch (data.Subscriber.Protocol)

    case "email json": add("Očitanje.json"); break;
    case "email text": add("Očitanje.txt")   break;
    default:           /* Do nothing */      break;
    

像这样的简单本地函数很可能被 JIT 编译器内联,所以应该没有开销。

【讨论】:

以上是关于C# 简化 switch 语句的主要内容,如果未能解决你的问题,请参考以下文章

C#中的switch语句失败?

C# 语句 分支语句 switch----case----.

带/不带大括号的 C# Switch 语句....有啥区别?

C#中一种替换switch语句更优雅的写法

正经学C#_判断[switch语句]:[c#入门经典]

C#判断 判断语句