class Class1
{
static void ChineseGreeting(string name)
{
Console.WriteLine("早上好,",name);
}
static void EnglishGreeting(string name)
{
Console.WriteLine("Good morning,",name);
}
static void Main(string[] args)
{
GreeteManager gm = new GreeteManager();
gm.Delegate1 = ChineseGreeting; //把=换成+=并不会报错
gm.Delegate1 += EnglishGreeting;
gm.GreetPeople("zz");
Console.ReadKey();
}
}
public class GreeteManager
{
public delegate void GreetingDelegate(string name);
public GreetingDelegate Delegate1;
public void GreetPeople(string name)
{
if (Delegate1 != null)
{
Delegate1(name);
}
}
}
为什么结果是这样的,还有就是当我把第一个 = 改为 += ,并不会报错,仍能得出和原来一样的结果,这又是为什么。
代码是照着http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx ,边学边敲,验证性学习
你应该是想知道 为什么输出的 没有“ZZ是吧”
那是因为 委托关联的两个方法 输入语句 写的有问题
应该写成这样
Console.WriteLine("早上好,"+name);
不是下面那样的
Console.WriteLine("早上好,",name);
有点 小马虎了吧
GreeteManager gm = new GreeteManager(); //实例化
gm.Delegate1 = ChineseGreeting; //这里是意思是把方法挂载到你的委托上
gm.Delegate1 += EnglishGreeting;
//同理也是挂载,当你挂载多个时,它会按挂载顺序执行,既然可以挂载也可以卸载-=就可以实现,当然第一次是不允许-=不然会报错
gm.GreetPeople("zz");//开始执行委托
Console.ReadKey();
=表示将一个委托对象赋值给委托变量;+=表示将一个委托对象添加到委托链上。两者的区别就在于=是替换原来的(如果有),
+是在把原来的跟新的委托对象连接在一起(委托链)。调用的时候“+“会调用委托链上所有的委托。
你应该是想知道 为什么输出的 没有“ZZ是吧”
那是因为 委托关联的两个方法 输入语句 写的有问题
应该写成这样
Console.WriteLine("早上好,"+name);
不是下面那样的
Console.WriteLine("早上好,",name);
第一个问题,改成这样即可
static void EnglishGreeting(string name)
{
Console.WriteLine("Good morning,{0}", name);
}
第二个问题
GreeteManager gm = new GreeteManager();
gm.Delegate1 = ChineseGreeting; //把=换成+=并不会报错
gm.Delegate1 += EnglishGreeting;
第一句是创建一个委托,第二句是给委托初始化,第三句是给委托增加一个方法。当“=”换成“+=”可以理解为直接给一个空的委托增加一个方法
效果是一样的。