说明(2017-6-14 09:08:38):
1. 首先是一个简单的委托
(1)命名空间下定义一个委托MyDel:
public delegate void MyDel(string name);
这个委托其实就是个壳,用来替换后面的EnglishSayHello和ChineseSayHello。
(2)声明一个函数SayHello来存放这个委托:public static void SayHello(string name,MyDel del)。
(3)然后在主函数里就可以使用这个SayHello函数调用委托,里面就可以换这两个方法了:
SayHello("Jack",EnglishSayHello);
SayHello("Ashley",ChineseSayHello);
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _11控制台委托 { public delegate void MyDel(string name); class Program { static void Main(string[] args) { SayHello("Jack",EnglishSayHello); SayHello("Ashley",ChineseSayHello); Console.ReadKey(); } public static void SayHello(string name,MyDel del) { del(name); } public static void EnglishSayHello(string name) { Console.WriteLine("Good Morning! "+name); } public static void ChineseSayHello(string name) { Console.WriteLine("早上好!"+name); } } }
2. 然后是委托的绑定:
其实可以不需要SayHello这个中间方法的,直接在主函数里实例化一个委托,但是不能new Delegate(),因为会提示“没有0个参数的重载”。
要这样,赋值一个方法:
MyDel del = EnglishSayHello;
再这样,再绑定一个方法:
del += ChineseSayHello;
调用这个委托后,会依次调用所有绑定的方法,所以直接输出两句问候了:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _11控制台委托 { public delegate void MyDel(string name); class Program { static void Main(string[] args) { MyDel del = EnglishSayHello; del += ChineseSayHello; del("Jack"); //SayHello("Jack",EnglishSayHello); //SayHello("Ashley",ChineseSayHello); Console.ReadKey(); } //public static void SayHello(string name,MyDel del) //{ // del(name); //} public static void EnglishSayHello(string name) { Console.WriteLine("Good Morning! "+name); } public static void ChineseSayHello(string name) { Console.WriteLine("早上好!"+name); } } }
3. 修改一下代码,以便下面引出事件:
这个做法不保密,如果用private修饰符,不能访问就失去委托的意义了;如果用public修饰符,委托可以随便赋值了不安全。因此需要使用事件event,将委托进行封装,只能+=和-=,不能=赋值。相当于字段与属性。
(1)MyDelegate类,把上面的几个方法放到单独的类文件里(实际开发中的样子),并且在类里直接定义一个MyDel类型的del字段,在SayHello里,判断一下del是否为空,不为空就调用。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _11控制台委托 { public delegate void MyDel(string name); class MyDelegate { public MyDel del; public void SayHello(string name) { if (del != null) { del(name); } } public void EnglishSayHello(string name) { Console.WriteLine("Good Morning! " + name); } public void ChineseSayHello(string name) { Console.WriteLine("早上好!" + name); } } }
(2)Program类,实例化MyDelegate,将md.del赋值和绑定两个方法,md.SayHello的时候就只带name参数就可以了,不需要del参数了。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _11控制台委托 { //public delegate void MyDel(string name); class Program { static void Main(string[] args) { MyDelegate md = new MyDelegate(); md.del = md.EnglishSayHello; md.del += md.ChineseSayHello; md.SayHello("Jack"); Console.ReadKey(); } } }
4. 事件,到这里其实就很简单了,把上面的代码简单修改两处:
(1)在MyDel委托前面加个event关键字:
(2)这时候就会提示:
将=变成+=,问题解决:
参考资料:
http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx