繁体   English   中英

C#泛型,寻求帮助以了解示例

[英]C# Generics , looking for help to understand a sample

我正在尝试理解为实现泛型而编写的现有代码,因此它建立了一个泛型字典,然后将项添加到字典中,且键为类型和值(代表)

private readonly Dictionary<Type, Func<actionType, Task>> requestedActions;

private void AddAction<T>(Func<T, Task> action) where T : actionType
{
    this.requestedActions[typeof(T)] = (request) => action((T)request);
}

this.AddAction<AddItem>(this.HandleAdd);
this.AddAction<UpdateItem>(this.HandleUpdate);
this.AddAction<DeleteItem>(this.HandleDelete);

 private Task HandleAdd(AddItem message)
    {
         .....
    }

然后,当收到一个动作时,它将执行相关的委托

 public bool ProcessData(ItemMessage request)
 {
    Func<ItemMessage, Task> requestAction;
    if (this.requestedActions.TryGetValue(requestType, out requestAction))
    {
          requestAction(request).Await();
    }                   

 }

为什么比在actionType上使用switch语句更喜欢这种方法,就像添加新类型一样,您仍然必须将新类型添加到字典中并实现新的处理函数。 我试图了解我在这种情况下使用泛型的好处?

switch (actionType)
      {
          case AddItem:
              HandleAdd();
              break;
          case UpdateItem:
              HandleUpdate();
              break;
      ...
      }

通用示例使您可以动态添加处理程序(在运行时),而switch语句基本上是“烘焙”到代码中的。

这是为什么我可以提出的主要例子。

通用示例看起来也不错。

在不知道使用场景的情况下很难说出哪种方法更好,但是通过最初的示例,您将能够从数据库中提取数据并对其进行序列化,而不必在每次引入新操作时都麻烦添加switch语句。 看起来可以通过使用泛型来节省开发时间。

让我们还检查一下使用此示例而不是使用switch语句的速度差异。 如果您在函数调用时准备好类型,则字典时间检索为O(1)。 这是与switch语句相同的时间减去负有麻烦的switch。

当您使用通用数据结构(字典)作为示例时,此问题与多态性有关,而不与通用有关。

正如您已经被告知的那样,切换是不好的,因为如果要添加另一种情况,则必须修改这段代码。 开关通常是代码异味,表明应使用多态性。

在这种情况下使用开关违反了打开/关闭原则( SOLID )。 简而言之,该原则表示,应打开代码进行更改,而关闭则进行修改。 您提供的示例遵循此规则。 如果要执行其他操作,则无需触摸此代码,只需添加另一个Task类。 使用switch时,您需要修改现有代码。

我希望这有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM