C#简化switch语句
C# simplify switch statement
我能否以某种方式简化此 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));
}
//另一种不使用 Switch 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));
另一种使用局部函数来简化调用的方法:
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 编译器内联,因此应该没有开销。
我能否以某种方式简化此 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));
}
//另一种不使用 Switch 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));
另一种使用局部函数来简化调用的方法:
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 编译器内联,因此应该没有开销。