个人技术分享

简述

        事件调用的所有方法都需要两个参数:object sender,EventArgs e。该事件使用这两个参数调用方法,因此我们不能直接添加自定义参数。

        比如下面这段代码,我们想在 MessageBox 中显示字符串 ' s ',这必然是不成。

private void Form1_Load (object sender, EventArgs e)
{
      string s = "Hello!";
      button.Click += new EventHandler(show_msg);
}

private void show_msg(object sender, EventArgs e, string s) 
{
      MessageBox.Show(s);
}

        你肯定要问,我为什么一定要传参数,我定义全局的不成么?当然可以,但是假如你这个事件关联到全局的字典,在事件里面要区分是谁调用,那就有用了。

        你可能还要问,那我再sender里面定义一些参数不就成了么?确实也可以,但是假如是跨进程呢,事件是由其它进程触发,我们无法挂载任何多余信息,而且进程状态不可控,并且关联到我们系统内的id,那么就需要再事件里面找到id,根据什么找呢?

        所以更好的方法就是在绑定事件的时候,就把自定义的参数传入。

        最简单的解决方案肯定是使用委托来调用我们的方法。

使用lambda 运算符

        代码清晰,简单方便

private void Form1_Load (object sender, EventArgs e)
{
      string s = "Hello!";
      button.Click += (sender2, e2) => show_msg(sender2, e2, s);
}

private void show_msg (object sender, EventArgs e, string s)
{
      MessageBox.Show(s);
}

使用委托重写

private void Form1_Load (object sender, EventArgs e)
{
    string s = "Hello!";

    button.Click += delegate(object sender2, EventArgs e2)
    {
        show_msg(sender2, e2, s);
    };
}

private void show_msg(object sender, EventArgs e, string s)
{
      MessageBox.Show(s);
}