C#简化了switch语句



我能以某种方式简化这个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;
}

这样的东西怎么样:

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));
}

切换表达式|C#引用

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

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));

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

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进行额外的测试,而直接的开关不会这样做——所以这(非常微弱(效率较低。

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

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编译器内联,所以应该没有开销。

相关内容

  • 没有找到相关文章

最新更新