- =新的EventHandler(方法)vs - =传递方法作为参数的方法

问题描述:

- = new EventHandler(Method)与 - =方法 之间的区别是什么时候传递参数?- =新的EventHandler(方法)vs - =传递方法作为参数的方法

为什么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,只是clearify我questation我补充说,调用这个方法的代码:

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); 
    } 
} 
+6

指向苹果的苹果与指向的苹果不同。 – CodeCaster

委托只能从一个方法创建。

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

由于您的_eh没有evHandler.Invoke作为处理程序,因此它什么也不做。

+0

没错。值得添加的是为什么这被接受,而不仅仅是一个编译器错误:如果委托类型不同,这是一个获得具有相同效果的不同类型委托的有用方式(例如'new Action (evHandler)')。在编译器中没有特殊的例外,如果类型相同,那么它就是错误的,所以它被接受。 – hvd

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

所以;

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); 

当+ =或​​ - =事件处理程序的一个新实例如

myHandler -= new EventHandler(someDelegate); 

new EventHander被传递到其中其靶委托相比,那些已经在myHandler实例的减量方法列表。它正在被删除的目标,而不是新的EventHandler实例。相反,当你;

myHandler += new EventHandler(someDelegate); 

的someDelegate被添加到所谓的将myHandler目标多播委托代表的现有列表。 new EventHandler被丢弃,并且只是该单一增量方法调用的货运承运人。