gpt4 book ai didi

c# - 简单事件c#

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:29 24 4
gpt4 key购买 nike

我有两个类,我必须创建一个事件来在这些类之间进行通信。

Class a
{
public delegate void delegat(int a);
public event delegat exit;
...
private void a_FormClosed(object sender, FormClosedEventArgs e)
{
// My event named exit should run here, but I get exception!
exit(100);
}
}

Class b
{
a instance=new a();
a.exit+=new a.delegat(my_fun);
...
private void my_fun(int x)
{
if(x==100)
do_smth;
...
}
}

但问题是我得到异常:“对象引用未设置为对象的实例”。我不明白我做错了什么?我应该在哪里创建一个新实例?感谢您的帮助!

最佳答案

您正在尝试在 本身而不是实例 上分配exit 事件,例如

a.exit += ...

应该是:

instance.exit += ...

在尝试触发事件之前,您也没有检查您的 exit 事件是否已分配。还有其他您没有考虑的问题,例如竞争条件。

这是一个相对安全的事件处理方式的一般示例,例如

public class A
{
public delegate void ExitHandler(object sender, int a);
public event ExitHandler Exit;
...
private void a_FormClosed(object sender, FormClosedEventArgs e)
{
OnExit(100);
}

protected virtual void OnExit(int a)
{
// take a reference to the event (incase it changes)
var handler = Exit;
if (handler != null)
{
handler(this, a);
}
}

}

public class B
{
private A _a;

public B()
{
_a = new A();
_a.Exit += (sender, value) => my_fun(value);
}

private void my_fun(int x)
{
if(x==100)
do_smth;
...
}
}

关于c# - 简单事件c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13879974/

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