c# - 委托(delegate)程序代码中的问题

标签 c#

我在名为 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/

相关文章:

c# - 如何防止 Web API 将我的模型从 JSON 序列化为字符串

c# - 'Timer' 是一个 'namespace' 但像 'type' 一样使用

c# - 从 C# 调用 C++ 时如何最好地处理未使用的指针?

c# - C# 8 中的默认接口(interface)方法

c# - 如何将自定义配置提供程序添加到azure函数

c# - 输入类型日期的客户端验证不起作用

c# - WCF 服务可以替代 TCPListener 的功能吗?

c# - 从中间件调用 Controller 的 Action 方法

c# - TPL 数据流选择阻止将项目发布到其中

c# - Xamarin Forms 中的多个 WCF 连接