- =新的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);
}
}
答
委托只能从一个方法创建。
new EventHandler(evHandler)
是new EventHandler(evHandler.Invoke)
的简写,因为Invoke
是实际调用委托的任何委托类型的方法。
由于您的_eh
没有evHandler.Invoke
作为处理程序,因此它什么也不做。
+0
没错。值得添加的是为什么这被接受,而不仅仅是一个编译器错误:如果委托类型不同,这是一个获得具有相同效果的不同类型委托的有用方式(例如'new Action
答
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
被丢弃,并且只是该单一增量方法调用的货运承运人。
指向苹果的苹果与指向的苹果不同。 – CodeCaster