代码之家  ›  专栏  ›  技术社区  ›  DotNetRussell

具有更好的性能、动作或连接到事件[关闭]

  •  3
  • DotNetRussell  · 技术社区  · 6 年前

    幕后故事:

    所以我想回答这个问题,我不知道该怎么做。我想也许这里的人有很好的学习资源,或者可能给出一个明确的答案。

    简言之,我想知道在标准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 回复  |  直到 6 年前
        1
  •  2
  •   usr    6 年前

    性能差异很小。

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

    这些都是很小的问题。

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

    1. 当您进行回调时,不能稍后更改回调。事件始终有一个订户。
    2. 您还可以将此委托验证为非空。
    3. 您还可以将此委托传递给其他代码。这对于一个事件是不可能的。
    4. 在事件版本中,您真的被迫不关心有多少订户。可能有零个或多个。订阅服务器列表可以随时更改。从这个角度来看,这是更灵活的。

    使用哪种样式取决于类应该如何使用。在这里,我喜欢活动风格A 一点 更好的是,你不会以任何方式对订户名单提出异议。