事件订阅的最佳选项

本文关键字:最佳 选项 事件 | 更新日期: 2023-09-27 17:54:11

你能告诉我哪一个是最好的方式来创建一个事件或所有的选项都很好?

        // OPTION 1
        buttonAlert.Click += delegate 
        {
            textChange.Text = string.Format("Hello World");
        };
        // OPTION 2
        buttonAlert.Click +=(sender, e) =>
        {
            textChange.Text = string.Format("Hello World");
        };
        // OPTION 3
        buttonAlert.Click += delegate (object sender, EventArgs e)
        {
            textChange.Text = string.Format("Hello World");
        };

事件订阅的最佳选项

这只是个人喜好的问题。在性能方面都是相等的。

所以,根据你的需要和喜好来选择。

作为我的回答的补充,我想提醒您必须在订阅(+=)之后取消订阅(-=)事件。

来自文档:

防止在事件发生时调用事件处理程序引发,只需从事件退订即可。为了防止资源泄漏时,取消订阅事件是很重要的处置订阅者对象。除非你取消订阅某个事件,作为发布事件基础的多播委托对象具有对封装控件的委托的引用订阅者的事件处理程序。只要发布对象保持该引用,您的订阅者对象将不会被垃圾收集。

当您不需要lambda参数(sender, event)时,我认为第一个选项是最好的。在第二和第三之间,我会选择第二,因为它更干净(只是个人喜好的问题)。

你也可以使用方法作为委托,这可能是最好的,如果你想正确地管理内存。当您使用委托或lambda时,无法取消订阅。这意味着,即使您销毁或离开活动/片段,对象仍将留在内存中,垃圾收集器将无法清除它。在用户多次打开和关闭此屏幕的情况下,您最终可能会得到OutOfMemoryException。这在Android中经常发生。这就是解决方案:

protected override void OnResume()
{
    base.OnResume();
    buttonAlert.Click += OnButtonClick;
}
protected override void OnPause()
{
    base.OnPause();
    buttonAlert.Click -= OnButtonClick;
}
private void OnButtonClick(object sender, EventArgs e)
{
    textChange.Text = string.Format("Hello World");
}