【发布时间】:2015-05-13 12:39:07
【问题描述】:
正如我在这里和那里读到的,在 C# 中使用或不使用委托对象的 new 关键字在调用列表中添加或删除方法是完全相同的,并且会产生相同的 IL。例如看这个:What is the difference between two ways of using delegates in C# (with new keyword and without) 有这段代码:
this.button1.Click += new System.EventHandler(this.button1_Click);
this.button1.Click += this.button1_Click;
这两者没有区别。但是当我使用delegate 作为方法参数传递时,我无意中观察到这段代码的异常输出:
private delegate void TextPrinter(string text);
private static TextPrinter _handler;
static void Main(string[] args)
{
TextPrinter myPrinter = PushMessage;
RegisterHandler(PushMessage);
UnRegisterHandler(PushMessage);
InvokePrinter("hello");
}
private static void RegisterHandler(TextPrinter methods)
{
_handler += methods;
}
private static void UnRegisterHandler(TextPrinter methods)
{
/* first routine >> */_handler -= new TextPrinter(methods);
/* second routine >> */ //_handler -= methods;
}
private static void InvokePrinter(string message)
{
_handler(message);
}
private static void PushMessage(string message)
{
Console.WriteLine("# :: {0}", message);
}
如果我使用UnRegisterHandler 中的第二个例程,一切都会按应有的方式运行。但是当我使用第一个时,PushMessage 方法不会从_handler 的调用列表中删除,尽管有或没有new 我猜它一定工作正常。那么,这里有什么问题呢?
谢谢。
【问题讨论】: