带代表或开关的字典?

Sam*_*yan 22 c# delegates dictionary switch-statement

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

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

switch(some_val)   
{   
    case 0:   
        func0();   
        break;   
    case 1:   
        func1();   
        break;   
}     
Run Code Online (Sandbox Code Playgroud)

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

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();    
Run Code Online (Sandbox Code Playgroud)

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

小智 11

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

var actions = new Dictionary<int, Action>
{
  {1, () => Console.WriteLine("One!")},
  {2, () => Console.WriteLine("Two!")}
}
Run Code Online (Sandbox Code Playgroud)

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

  • 它会比开关慢.不过要小心点; 过早优化是万恶之源.良好的设计,可读性以及所有爵士乐的代码,如果速度太慢,只适用于速度部分.速度差异可能完全可以忽略不计,但可读性差异是真实而明显的. (7认同)

Gra*_*ote 9

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

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

  • 您也可以使用旧式替代方案来剪切和粘贴编程.将switch语句放入方法中. (5认同)

Joh*_*dom 7

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