并且无论开关在哪里,它都会执行 dict["value"].Invoke(...)。代码在某些方面感觉不对,但与此同时,-6ren">
gpt4 book ai didi

c# - "Function lookup table"代替开关

转载 作者:太空狗 更新时间:2023-10-29 20:00:31 25 4
gpt4 key购买 nike

我最近遇到了一些代码,通过硬编码 a 来代替开关的使用

Dictionary<string (or whatever we would've been switching on), Func<...>> 

并且无论开关在哪里,它都会执行 dict["value"].Invoke(...)。代码在某些方面感觉不对,但与此同时,这些方法确实看起来更简洁了,尤其是当有很多可能的情况时。我不能给出任何理由来说明为什么这是好的或坏的设计,所以我希望有人能给出一些理由来支持/谴责这种代码。性能有提升吗?失去清晰度?

例子:

public class A {
...
public int SomeMethod(string arg){
...
switch(arg) {
case "a": do stuff; break;
case "b": do other stuff; break;
etc.
}
...
}
...
}

成为

public class A {

Dictionary<string, Func<int>> funcs = new Dictionary<string, Func<int>> {
{ "a", () => 0; },
{ "b", () => DoOtherStuff(); }
... etc.
};

public int SomeMethod(string arg){
...
funcs[arg].Invoke();
...
}
...
}

最佳答案

优点:

  1. 您可以在运行时更改“开关”在运行时的行为
  2. 它不会混淆使用它的方法
  3. 您可以处理非文字情况(即 case a + b == 3),这样麻烦就少得多

缺点:

  1. 您的所有方法都必须具有相同的签名。
  2. 你有一个范围的变化,你不能使用方法范围内定义的变量,除非你在 lambda 中捕获它们,如果你在某个时候添加一个变量,你将不得不重新定义所有的 lambda
  3. 你必须专门处理不存在的索引(类似于 switch 中的 default)
  4. 如果出现未处理的异常,堆栈跟踪将更加复杂,导致应用程序更难调试

你应该使用它吗?这真的取决于。你必须在某个地方定义字典,所以代码会在某个地方被它弄乱。你必须自己决定。如果您需要在运行时切换行为,字典解决方案确实很突出,特别是如果您使用的方法没有副作用(即不需要访问作用域变量)。

关于c# - "Function lookup table"代替开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5261846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com