gpt4 book ai didi

c# - 两个处理实现之间的区别?

转载 作者:太空狗 更新时间:2023-10-29 23:16:52 26 4
gpt4 key购买 nike

这两种实现有区别吗?

1:

public class SMSManager : ManagerBase
{
private EventHandler<SheetButtonClickEventArgs> _buttonClickevent;

public SMSManager(DataBlock smsDataBlock, DataBlock telephonesDataBlock) :
base(smsDataBlock)
{
_buttonClickevent = new EventHandler<SheetButtonClickEventArgs>(OnButtonClick);
SheetEvents.ButtonClick += _buttonClickevent;

}

public override void Dispose()
{
base.Dispose();
if (_buttonClickevent != null)
SheetEvents.ButtonClick -= _buttonClickevent;
}
}

2:

public class SMSManager : ManagerBase
{
public SMSManager(DataBlock smsDataBlock, DataBlock telephonesDataBlock) :
base(smsDataBlock)
{
SheetEvents.ButtonClick += new EventHandler<SheetButtonClickEventArgs>(OnButtonClick);
}

public override void Dispose()
{
base.Dispose();
SheetEvents.ButtonClick -= new EventHandler<SheetButtonClickEventArgs>(OnButtonClick);
}
}

关于内存泄漏,第一个似乎比第二个更正确。但这真的正确吗?

最佳答案

总而言之,第二段代码是正确且安全的(即使没有注册处理程序)。

考虑这个示例应用:

namespace ConsoleApplication61
{
class Program
{
static void Main(string[] args)
{
var f = new Foo();
f.MyEvent += new EventHandler(Handler);
f.Trigger();
f.MyEvent -= new EventHandler(Handler);
f.Trigger();
Console.Read();
}

static void Handler(object sender, EventArgs e)
{
Console.WriteLine("handled");
}
}

class Foo
{
public event EventHandler MyEvent;
public void Trigger()
{
if (MyEvent != null)
MyEvent(null, null);
}
}
}

此示例打印“已处理”一次。

因此在您的示例中,它们在功能上是相同的,并且都将根据需要工作。删除尚未添加的处理程序也是一种安全操作,它只是找不到要删除的内容并且什么都不做。

正如评论中所提供的,Marc 的回答更加详细:

Unregister events with new instance of the delegate


具有匿名方法的事件处理程序

值得注意的是,lambda 表达式形式的事件处理程序不能保证基于实例和方法签名强制执行唯一性。如果您需要取消订阅匿名方法,您要么需要将其提升为方法,要么保留对匿名方法的引用以备后用:

Func<object, EventArgs> meth = (s, e) => DoSomething();

myEvent += meth;
myEvent -= meth;

Jon Skeet 详细回答了这个问题,并且可能比我做得更好:-)

How to remove a lambda event handler


轻微重构

我将重构为以下内容:

public class SMSManager : ManagerBase
{
public SMSManager(DataBlock smsDataBlock, DataBlock telephonesDataBlock)
: base(smsDataBlock)
{
SheetEvents.ButtonClick += OnButtonClick;
}

public override void Dispose()
{
SheetEvents.ButtonClick -= OnButtonClick;
base.Dispose();
}
}

关于c# - 两个处理实现之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10704710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com