Switch Case中能否合并重复代码、分离差异代码?
消除switch分支冗余代码的几种方法
先看你的原代码:
switch(expression) { case x: <a href=https://www.w3schools.com>Visit W3Schools</a> for (int i = 3; i >= 0; i--) { Console.WriteLine(i); } break; case y: <a role="link" aria-disabled="true"> Disabled link </a> for (int i = 3; i >= 0; i--) { Console.WriteLine(i); } default: // code block break; }
针对case x和y的重复for循环,有几种方式可以消除冗余:
1. 把重复逻辑抽成独立方法
最直观的方式是把重复的循环代码封装成一个方法,每个case只处理差异的HTML标签,再调用这个方法:
// 提取循环逻辑到单独方法 private void RunCountdown() { for (int i = 3; i >= 0; i--) { Console.WriteLine(i); } } // 优化后的switch switch(expression) { case x: <a href=https://www.w3schools.com>Visit W3Schools</a> RunCountdown(); break; case y: <a role="link" aria-disabled="true"> Disabled link </a> RunCountdown(); break; default: // code block break; }
这种方式的好处是代码复用性高,如果后续需要修改循环逻辑,只改一处就行。
2. 合并分支,利用跳转执行共同逻辑
可以让case x处理完自己的HTML标签后,跳转到case y执行循环逻辑,避免重复代码:
switch(expression) { case x: <a href=https://www.w3schools.com>Visit W3Schools</a> goto case y; // 跳转到y分支执行循环 case y: for (int i = 3; i >= 0; i--) { Console.WriteLine(i); } break; default: // code block break; }
或者把共同逻辑放到switch外面,通过标签跳过不需要执行的情况:
switch(expression) { case x: <a href=https://www.w3schools.com>Visit W3Schools</a> break; case y: <a role="link" aria-disabled="true"> Disabled link </a> break; default: // code block goto EndSwitch; // 跳过循环逻辑 } // 共同的循环代码,只有x或y时才执行 for (int i = 3; i >= 0; i--) { Console.WriteLine(i); } EndSwitch: ;
3. 用模式匹配简化分支(C# 8.0及以上)
如果用的是较新的C#版本,可以用模式匹配直接判断expression是x还是y,再分别处理标签,最后统一执行循环:
if (expression is x or y) { // 根据值输出对应的HTML标签 if (expression == x) { <a href=https://www.w3schools.com>Visit W3Schools</a> } else { <a role="link" aria-disabled="true"> Disabled link </a> } // 执行共同循环 for (int i = 3; i >= 0; i--) { Console.WriteLine(i); } } else { // default分支的代码块 }
内容的提问来源于stack exchange,提问作者user28104247
相关产品推荐
相关产品推荐

