- = new EventHandler(Method)vs - =将方法作为参数传递时的方法

时间:2017-01-16 19:50:51

标签: c# events

- = new EventHandler(Method)与 - = Method 之间有什么区别? 当方法传递为参数?

为什么 removeNew 无法取消订阅?

请参阅以下课程:

public class Class1
{
    public EventHandler _eh;

    public void OnEvent()
    {
        if (_eh != null)
        {
            _eh.Invoke("", new EventArgs());
        }
    }

    public void remove(EventHandler evHandler)
    {
        // unsubscribe successfully
        _eh -= evHandler;
    }

    public void removeNew(EventHandler evHandler)
    {
        // failed to unsubscribe
        _eh -= new EventHandler(evHandler);
    }
}

更新

@SchabseLaks,只是为了澄清我的问题我正在添加调用此方法的代码:

public partial class Form1 : Form
{
    Class1 c1 = new Class1();
    public Form1()
    {
        InitializeComponent();
        c1._eh += Hello;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        c1.OnEvent();
    }

    private void Hello(object sender, EventArgs e)
    {
        MessageBox.Show("hello");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        c1.removeNew(Hello);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        c1.remove(Hello);
    }
}

2 个答案:

答案 0 :(得分:7)

只能从方法创建委托。

new EventHandler(evHandler)new EventHandler(evHandler.Invoke)的简写,因为Invoke是实际调用委托的任何委托类型的方法。

由于您的_eh没有evHandler.Invoke作为处理程序,因此无效。

答案 1 :(得分:0)

EventHandler的语法经常令人困惑。理解它的关键是要实现它覆盖Equals运算符,使得一个EventHandler等于另一个,因为它们拥有与事件目标相同的Delegate(或委托列表)。

因此;

var x = new EventHandler(myDelegate);
var y = new EventHandler(myDelegate);
Assert.IsTrue(x == y);


var x = new EventHandler(myDelegate);
var y = new EventHandler(anotherDelegate);
Assert.IsFalse(x == y);

当你+ =或 - =一个新的EventHandler实例时,如

myHandler -= new EventHandler(someDelegate);

new EventHander传递到myHandler实例的递减方法,其中将其目标委托与列表中已有的委托进行比较。它的目标是被删除,而不是新的EventHandler实例。相反,当你;

myHandler += new EventHandler(someDelegate);

someDelegate被添加到名为myHandler的目标多播委托上的现有委托列表中。 new EventHandler被丢弃,只是该单一增量方法调用的货物承运人。