c#-具有更好的性能,操作或与事件的连线

幕后故事:

因此,我试图回答这个问题,但不确定如何解决.我认为也许有人在这里有很好的学习资源,或者可能给出一个明确的答案.

简而言之,我想知道在标准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;
    }
}
最佳答案
性能差异很小.

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

这些都是非常小的要点.

基于代码质量问题,应使用哪种回调样式?

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

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

点击查看更多相关文章

转载注明原文:c#-具有更好的性能,操作或与事件的连线 - 乐贴网