- = 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);
}
}
答案 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
被丢弃,只是该单一增量方法调用的货物承运人。