C# 减少if嵌套
最近维护一批代码,其中包括一堆if...的使用,多的情况嵌套8、9层,痛苦不堪,所以搜寻一些可以降低if...else的方法来改善一下代码,写个简单总结。
第一种:
优化前
if (measuredValue > 8) return 5 * measuredValue * measuredValue - 3; if (measuredValue > 4) return 4 * measuredValue - 2; if (measuredValue >= 0) return 3 * measuredValue - 1; return 2 * measuredValue;
使用列表和linq优化后(摘自:https://www.linkedin.com/pulse/if-less-programming-c-jiri-pokorny)
using System; using System.Linq; namespace ConsoleApp1 { internal class Program { private static readonly MeasureTransform[] Transformations = new MeasureTransform[] { // 这个顺序决定了判断先后顺序 new MeasureTransform(m => m > 8, m => 5 * m * m - 3), new MeasureTransform(m => m > 4, m => 4 * m - 2), new MeasureTransform(m => m >= 0, m => 3 * m - 1), new MeasureTransform(m => true, m => 2 * m) }; private static void Main(string[] args) { var executor = Transformations.First(t => t.CanApply(16)); Console.Write(executor.Transform(16)); } } internal class MeasureTransform { public MeasureTransform(Func<int, bool> canApply, Func<int, int> transform) { CanApply = canApply ?? throw new ArgumentNullException(nameof(canApply)); Transform = transform ?? throw new ArgumentNullException(nameof(transform)); } public Func<int, bool> CanApply { get; set; } public Func<int, int> Transform { get; set; } } }
第二种:使用逻辑运算符改善
using System; using System.Linq; namespace ConsoleApp1 { internal class Program { private static void Main(string[] args) { int a = 10; int b = 10; // 优化前 if (a > 5) { if (b > 10) { Console.Write(""); } } // 优化后 if (a > 5 && b > 10) { Console.Write(""); } } } }
第三种:从业务逻辑角度看看有没有多余的判断
using System; using System.Linq; namespace ConsoleApp1 { internal class Program { private static void Main(string[] args) { System.UInt32 a = 10; int b = (int)a + 10; // 优化前 if (a > 10) { if (b > 10) { Console.Write(""); } } // 优化后 if (a > 10) { Console.Write(""); } } } }
第四种:使用三元运算符
优化前
namespace ConsoleApp1 { internal class Program { private static void Main(string[] args) { System.UInt32 a = 10; uint c; if (a > 10) { c = a; } else { c = a + 10; } } } }
优化后
using System; using System.Linq; namespace ConsoleApp1 { internal class Program { private static void Main(string[] args) { System.UInt32 a = 10; int b = (int)a + 10; // 优化前 var c = a > 10 ? a : a + 10; } } }
第五种:太多if..else if...效率低,使用switch...case...,也好看点。
第六种:从架构层面使用依赖注入,反射之类的,参考https://www.c-sharpcorner.com/forums/how-can-i-remove-multiple-if-statement。
第七种:使用goto(注意:goto块是会按顺序执行的 例如:有label1、label2、label3 块按顺序写,如果label1执行完没有goto label3,则label2也会执行)
量变会引起质变。