将方法存储在自定义Tcp或Udp服务器的字典中.这是个好主意吗?C#

本文关键字:好主意 字典 存储 方法 自定义 Tcp 服务器 Udp | 更新日期: 2023-09-27 18:01:08

我正在考虑将方法存储在字典中(使用友好的用户可读字符串作为关键字(,这样就可以向服务器发送类似"echo,hello-world"的消息,服务器就会知道调用:echo(字符串消息(并传入"hello-world"。

伪代码:

public delegate void NetCommand(object param);
void MyNetCommand(object param)
{
  string s = param as string;
  Console.WriteLine(s);
}
Dictionary<string, NetCommand> commands = new Dictionary<string, NetCommand>();
static void Main(string[] args)
{
  commands.Add("echo", MyNetCommand);
} 
void OnReceiveSomeImaginaryMessageAfterItsBeenProcessed(string friendly, object param)
{
  commands[friendly]();
}

我的问题是:这是个好主意吗?这样做有缺点吗?或者,这只是做一些已经有了理想解决方案的事情的"错误"方式吗?

将方法存储在自定义Tcp或Udp服务器的字典中.这是个好主意吗?C#

我不明白为什么这不是一个好主意,而且将它们存储在内存中意味着你也会得到更深入的提升。

它看起来很酷,只需使用

if (commands.HasKey(friendly)) 

在做之前…

您也缺少param,如:

commands[friendly](param);

我个人认为这是一个足够优雅的解决方案。我个人会改变的一个想法是:把一个delefate放进字典的Value中,而不是放一个类对象。在这种情况下,yuo可以很容易地支持未来不断增加的代码复杂性。

public abstract class MyAbstractNetCommand {   
     public abstract void ExecuteCommand();
} 
public class ConcreteCommand : MyAbstractNetCommand {
    /*Here additional ConcreteCommand specific methods and state members*/
    public override ExecuteCommand() {
       // concrete iplementation
    }
}

您的性能将是O(log(n((,但是切换/切换字符串将具有相同的O(log((性能,所以您不会做任何坏事。无论如何,命令路由不应该成为瓶颈。