【发布时间】:2015-03-27 02:52:51
【问题描述】:
考虑以下演示
class Program
{
static void Main(string[] args)
{
MyCallBackClass myCallbackInstance = new MyCallBackClass();
MyDelegate myDelegate = delegate() { /*Do nothing*/ };
myDelegate += () => { Console.WriteLine("First"); };
myDelegate += () => { Console.WriteLine("Second"); };
myCallbackInstance.Callback = myDelegate;
myDelegate += () => { Console.WriteLine("Third"); };
myCallbackInstance.InvokeCallback();
Console.ReadLine();
}
}
delegate void MyDelegate();
class MyCallBackClass
{
public MyDelegate Callback { get; set; }
public void InvokeCallback()
{
if (Callback != null)
Callback();
}
}
由于委托是 C# 中的引用类型,如在此处阅读 Why are delegates reference types? 我希望我的对象中对委托 ("Callback") 的引用指向与对象外的引用 ("myDelegate")。令我惊讶的是,这个演示应用程序的输出是:
First
Second
,添加到委托的第三个元素(MulticastDelegate)不被对象调用。
这不是我对引用类型所期望的行为,在我看来,委托的处理方式就好像它是一个值类型一样。我的假设哪里错了?为什么不调用第三个委托元素?
【问题讨论】:
-
您链接到的帖子已经讨论了
Delegates 是不可变引用类型。就像System.String。