我在名为 usedelegates
的类库中编写了这段代码:
namespace useofdelegates
{
public class Class1
{ //int i;
public delegate void mydelegate(object sender,EventArgs e);
public event mydelegate myevent;
public void fire()
{
EventArgs ee = new EventArgs();
myevent(this,ee);
}
}
}
然后在 Windows 窗体应用程序中,我打算在单击按钮时触发此事件。表单应用程序中的代码是:
namespace WindowsFormsApplication9
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
useofdelegates.Class1 ob;
private void button1_Click(object sender, EventArgs e)
{
// ob = new useofdelegates.Class1();
***ob.fire();***//give exception as object reference not set to an instance of an object.*/
}
private void Form1_Load(object sender, EventArgs e)
{
useofdelegates.Class1 ob = new useofdelegates.Class1();
ob.myevent+=new useofdelegates.Class1.mydelegate(ob_myevent);
// ob.fire();
}
public void ob_myevent(object sender, EventArgs e)
{
MessageBox.Show("hello hapiness");
}
}
}
这段代码在编译时抛出异常:
Object reference not set to an instance of an object.
但是当我在 form_load()
中调用 ob.fire()
时,它毫无异常(exception)地给了我想要的结果。为什么会这样?
最佳答案
几件事:
ob
对象不是类变量(字段)所以每个函数都需要初始化它,注册事件然后调用它。您是在加载表单时执行此操作,而不是在单击按钮时执行此操作。
或者更确切地说,查看您的代码,您正在使用同名方法变量隐藏表单加载中的字段。
这应该可以正常工作:
useofdelegates.Class1 ob;
private void button1_Click(object sender, EventArgs e)
{
ob.fire();
}
private void Form1_Load(object sender, EventArgs e)
{
ob = new useofdelegates.Class1();
ob.myevent+=new useofdelegates.Class1.mydelegate(ob_myevent);
}
在定义事件和委托(delegate)的类中调用它之前,还需要检查委托(delegate)对象是否不为空:
if (myevent != null)
myevent(this,ee);
线程安全版本是这样的:
mydelegate eventcopy = myevent;
if (eventcopy != null)
eventcopy(this,ee);
关于c# - 委托(delegate)程序代码中的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3328264/