带代表或开关的字典?

我正在编写一个解析器,它调用一些依赖于某些值的函数。

我可以用这样的简单开关实现这个逻辑:

switch(some_val) { case 0: func0(); break; case 1: func1(); break; } 

或者与代表和这样的字典:

 delegate void some_delegate(); Dictionary some_dictionary = new Dictionary(); some_dictionary[0] = func0; some_dictionary[1] = func1; some_dictionary[some_value].Invoke(); 

这两种方法是否相同,哪种方法更受欢迎?

在访问方面,它们是相同的:只检查该特定值是否具有相应的结果。 但是,如果您尝试访问不存在的键,则Dictionary会抛出越界exception。

选择应主要是可重用性。 如果你只需要在一个点上建立这个分支逻辑,那么使用switch-case可能比存储变量更有意义。 如果需要在不同的点重复访问它,请使用Dictionary来避免重复粘贴switch语句。

我非常喜欢字典选择,因为使用初始化程序,它可以更紧凑和可读:

 var actions = new Dictionary { {1, () => Console.WriteLine("One!")}, {2, () => Console.WriteLine("Two!")} } 

此外,你有更多的灵活性; 您可以以编程方式添加条件和操作,这通常很方便,具体取决于您正在执行的操作。

如果您团队中的典型程序员与我经常处理的程序员类似,那么您应该选择最简单的选项,即交换机。 代表们在我看来就像一个不需要的“聪明”解决方案。

我喜欢字典方法,因为它使您能够在需要时替换lambda表达式。 对于程序员来说,对于涉及使用复杂决策树的程序的案例,这是一个很好的技巧。 在运行时修改你的switch case块是非常笨拙的,最好的答案最终还是会涉及lambdas。

我曾经遇到过需要动态创建switch语句的情况。 这种方法提供了更多可读解决方案。

两者都做同样的事情(你应该检查关键字是否出现在dictonary)。

这只是一个可读性的问题。 什么看起来最适合您,更重要的是,阅读您的代码的人更喜欢什么。

(我认为字典)

如果您需要在资源文件中打开字符串,比如说出于全球化的目的,那么您需要使用字典/委托方法。