gpt4 book ai didi

c# - 事件驱动编程

转载 作者:太空狗 更新时间:2023-10-30 00:14:13 24 4
gpt4 key购买 nike

我一直在阅读 this MSDN articlethis question尝试了解 .NET 中的事件。不幸的是,它没有为我点击,我遇到了很多麻烦。我正在尝试将此技术集成到我的项目中,但收效甚微。

基本上,我有这门课会读数字。每当它遇到一个新数字时,我希望它触发一个名为 numberChanged 的​​事件。

因此,我设置了我的事件 public event EventHandler numberChanged;。稍后,当遇到与前一个数字不同的数字时,我会触发我的事件。

if(currentNumber != previousNumber){
if(numberChanged != null){
numberChanged(this, new EventArgs());
}
}

但是我在“订阅”这个事件时遇到了麻烦。如果我执行 numberChanged += [something to do here],它会错误地说 numberChanged 是一个事件而不是一个类型。

我的解释是否足够清晰,可以提供一些建议?非常感谢。

最佳答案

有很多方法可以处理,最基本的是创建一个函数:

public void MyNumberChangedHandler(object sender, EventArgs e)
{
//Your code goes here that gets called when the number changes
}

然后您通过以下方式订阅(仅一次,通常在构造函数中):

numberChanged += MyNumberChangedHandler;

或者,您可以使用一种称为匿名 (lambda) 方法的方法,它也在您的构造函数中分配(通常):

numberChanged += (sender, e) => {
//Your code here to handle the number changed event
};

要扩展一点,在使用 lambda 方法时必须小心,因为您可能会造成内存泄漏和僵尸对象。 .NET 内存垃圾收集器是一种标记清除系统,可在对象不再使用时将其删除。这篇文章展示了删除 lambda 事件处理程序有多么困难:How to remove a lambda event handler .

拥有一个事件的事件处理程序可以让您的对象保持事件状态即使它已被处置!这是创建僵尸对象的示例(不在 Fiddle 中运行,但您可以复制到您自己的控制台应用程序)https://dotnetfiddle.net/EfNpZ5

打印出来:

I'm still aliveI'm still aliveI was disposed!Press any key to quitI'm still aliveI'm still aliveI'm still alive.

关于c# - 事件驱动编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31462316/

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