C# 消除函数内部的if-else 的简单的方法
在很多情况下,有些函数内部有太多的if-else,不太直观,也难以维护。举个简单的例子:
class Program { static void Main(string[] args) { ShowErrorMessage("3"); Console.ReadLine(); } public static void ShowErrorMessage(string input) { string errorMessage; if (input == "1") { errorMessage = $"One({input})"; Console.WriteLine(errorMessage); return; } else if (input == "2") { errorMessage = $"Two({input})"; Console.WriteLine(errorMessage); return; } else if (input == "3") { errorMessage = $"Three({input})"; Console.WriteLine(errorMessage); return; } else if (input == "4") { errorMessage = $"Four({input})"; Console.WriteLine(errorMessage); return; } else { Console.WriteLine("Unknow error!"); } } }
在网络上有很多解决的方案,比如策略+工厂+ 配置等复合设计模式,或者反射,实现起来大都比较复杂,对于这么一个简单的函数,有些杀鸡用牛刀的感觉。下面介绍一种比较简单的方法:
private static Dictionary<string, Func<string>> errorMessages = new Dictionary<string, Func<string>> { { "1", ()=>{ return $"One(1)";} }, { "2", ()=>{ return $"Two(2)";} }, { "3", ()=>{ return $"Three(3)";} }, { "4", ()=>{ return $"Four(4)";} }, }; public static void ShowErrorMessage(string input) { if (!string.IsNullOrWhiteSpace(input) && errorMessages.ContainsKey(input)) { Console.WriteLine(errorMessages[input].Invoke()); } Console.WriteLine("Unknow error!"); }
通过Dictionary配置+Func的方式,消除了过多的if-else结构,当需要增加一项逻辑判断的时候,不需更改主函数ShowErrorMessage,仅在Dictionary中增加一项配置即可。