我正在编写一个解析器,它调用一些依赖于某些值的函数。
我可以用这样的简单开关实现这个逻辑:
switch(some_val)
{
case 0:
func0();
break;
case 1:
func1();
break;
}
或与代表和这样的字典:
delegate void some_delegate();
Dictionary<int, some_delegate> some_dictionary = new Dictionary<int, some_delegate>();
some_dictionary[0] = func0;
some_dictionary[1] = func1;
some_dictionary[some_value].Invoke();
这两种方法是否相同,哪种方法更受欢迎?
答案 0 :(得分:11)
我更喜欢字典选择,因为使用初始化程序,它可以更紧凑和可读:
var actions = new Dictionary<int, Action>
{
{1, () => Console.WriteLine("One!")},
{2, () => Console.WriteLine("Two!")}
}
另外,你有更多的灵活性;您可以以编程方式添加条件和操作,这通常很方便,具体取决于您正在执行的操作。
答案 1 :(得分:9)
在访问方面,它们是相同的:两者都只检查该特定值是否具有相应的结果。但是,如果您尝试访问不存在的密钥,则Dictionary会抛出越界异常。
选择主要应该是可重用性。如果您只需要在一个点上创建这个分支逻辑,那么使用switch-case可能比存储变量更有意义。如果你需要在不同的点重复访问它,那么使用Dictionary来避免重复粘贴switch语句。
答案 2 :(得分:7)
如果您团队中的典型程序员与我经常处理的程序员类似,那么您应该选择最简单的选项,即交换机。代表们在我看来是一个不需要的“聪明”解决方案。
答案 3 :(得分:4)
我喜欢字典方法,因为它使您能够在需要时替换lambda表达式。对于程序员来说,对于涉及使用复杂决策树的程序的案例,这是一个很好的技巧。在运行时修改你的switch case块是非常笨拙的,最好的答案最终还是会涉及lambdas。
我曾经遇到过需要动态创建switch语句的情况。这种方法提供了更多可读解决方案。
答案 4 :(得分:2)
两者都做同样的事情(你应该检查关键字是否出现在dictonary中)。
这只是一个可读性的问题。什么看起来最适合您,更重要的是,阅读您的代码的人更喜欢什么。
(我认为字典)
答案 5 :(得分:0)
如果您需要在资源文件中打开字符串,比如说出于全球化的目的,那么您需要使用字典/委托方法。