活动订阅的最佳选择

时间:2016-07-01 23:22:50

标签: c# android xamarin

你能告诉我创建活动的最佳方式是什么,或者所有选项都很好吗?

        // 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");
        };

2 个答案:

答案 0 :(得分:3)

这只是一个偏好问题。在性能方面都是等价的。

因此,请根据您的需要和喜好进行选择。

作为我答案的补充,我想提醒您必须在订阅(+ =)后取消订阅活动( - =)。

来自documentation

  

防止在事件发生时调用事件处理程序   提出,只是取消订阅该事件。为了阻止   资源泄漏,在您之前取消订阅事件非常重要   处理订户对象。在您取消订阅活动之前,   多播委托是发布中事件的基础   object有一个对封装的委托的引用   订阅者的事件处理程序。只要发布对象成立即可   该引用,您的订阅者对象将不会被垃圾回收。

答案 1 :(得分:2)

我会说当你不需要lambda参数(发送者,事件)时,第一个选项是最好的。 在第二和第三之间我会选择第二,因为它更清洁(只是一个偏好的问题。

您还可以将方法用作委托,如果您想正确管理内存,这可能是最好的。当您使用委托或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");
}