具有更好的性能,动作或事件连线

时间:2019-01-26 04:37:02

标签: c# performance standards

背景故事:

所以我试图回答这个问题,但不确定如何解决。我认为也许有人在这里有很好的学习资源,或者可以给出清晰的答案。

简而言之,我想知道在标准C#OOP编程中哪些在性能上更好,哪些在实践上更好。

问题:

是更好地准备一个事件,还是让消费者注入一个可以被结果调用的动作呢?

示例:

例如,我正在构建一个搜索面板。我的小组应该真的很擅长搜索,但并不十分在乎其结果的使用方式。

因此,我的两个选择是,在我的视图模型中创建一个完成的事件,并从与结果相关的内容中进行连接,或者选择第二个选项,允许调用者注入将在搜索时调用的回调操作。完成了。

我最初的想法是至少它们是相等的,因为事件和操作都应该只是被调用的函数引用指针。但是,我可以看到气泡事件的效果较差。

示例代码:

public class Consumer{

    public Consumer(){
          StandardViewModel viewModel = new StandardViewModel(CompletedCallback);
          viewModel.customEvent += someEventHandler;
    }

    public void someEventHandler(Object sender, EventArgs args){
       // do something with results
    }
    public void CompletedCallback(List<string> results){
       // do something with results
    }

}


public class StandardViewModel{
    public event EventHandler customEvent;
    private Action<IEnumerable<string> _callback;
    public StandardViewModel(Action<IEnumerable<string>> callback){
           _callback = callback;
    }
}

1 个答案:

答案 0 :(得分:2)

性能差异很小。

  1. 事件由编译器生成的委托字段实现。当事件只有一个订阅者(通常情况)时,该代表就像手动代表一样。
  2. 事件通常具有object sender, EventArgs args自变量(尽管这是可选的)。这可能会导致微小的性能差异。与仅将委托传递给构造函数相比,附加到事件上的性能成本也很小。
  3. 事件不会在.NET中“冒泡”。

这些都是非常小的要点。

应基于代码质量考虑使用哪种回调样式?

  1. 进行回调时,以后无法更改回调。该活动永远只有一个订户。
  2. 您还可以验证此委托不为空。
  3. 您还可以将此委托传递给其他代码。事件无法实现。
  4. 在事件版本中,您实际上被迫不在意有多少订户。可能为零或多个。订户列表可以随时更改。从这个角度来看,这更加灵活。

使用哪种样式取决于应该使用该类的方式。在这里,我更喜欢将事件样式设置为 bit ,因为您确实不以任何方式关注订户列表。