问题描述
- C# 委托与事件 有点小问题
-
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();
解决方案三:
=表示将一个委托对象赋值给委托变量;+=表示将一个委托对象添加到委托链上。两者的区别就在于=是替换原来的(如果有),
+是在把原来的跟新的委托对象连接在一起(委托链)。调用的时候“+“会调用委托链上所有的委托。
解决方案四:
第一个问题,改成这样即可
static void EnglishGreeting(string name)
{
Console.WriteLine("Good morning,{0}", name);
}
第二个问题
GreeteManager gm = new GreeteManager();
gm.Delegate1 = ChineseGreeting; //把=换成+=并不会报错
gm.Delegate1 += EnglishGreeting;
第一句是创建一个委托,第二句是给委托初始化,第三句是给委托增加一个方法。当“=”换成“+=”可以理解为直接给一个空的委托增加一个方法
效果是一样的。
解决方案五:
C# 中的委托和事件
c#中的委托和事件
c#委托与事件
解决方案六:
你应该是想知道 为什么输出的 没有“ZZ是吧”
那是因为 委托关联的两个方法 输入语句 写的有问题
应该写成这样
Console.WriteLine("早上好,"+name);
不是下面那样的
Console.WriteLine("早上好,",name);