区别:
- 委托可以直接被外部调用,而事件不可以。
- 委托可以用=,而事件不可以。
相同点:
- 委托和事件都可以用+=,-=来添加和删除方法。
- 委托和事件都可以有返回值,取最后一个方法的返回值。
using System; namespace ConsoleApplication27 { class Program { static void Main(string[] args) { A a = new A(); a.init(); a.myDelegate("1");//外部内部都可以调用 a.invokeMydelegate("2"); //a.myEvent = new myDelegate(f1);//编译出错,事件不能用“=” a.myEvent += new myDelegate(f1); //a.myEvent("3.5");//编译出错,事件不能在外部调用。 a.fireEvent("3"); myDelegate d2 = new myDelegate(f2); a.myEvent += d2; a.fireEvent("4"); a.myEvent -= d2; a.fireEvent("5"); a.myDelegate += new myDelegate(f3);//委托和事件一样可以增删 a.myDelegate("6"); int i = a.myDelegate("7"); Console.WriteLine("delegate length:" + i); a.myEvent += new myDelegate(f3); int j = a.fireEvent("8"); Console.WriteLine("event length:" + j); a.myDelegate = new myDelegate(f1); a.myDelegate("9");//用= Console.Read(); } static int f1(string s) { Console.WriteLine("(" + s + ")"); return s.Length; } static int f2(string s) { Console.WriteLine("[" + s + "]"); return s.Length; } static int f3(string s) { Console.WriteLine("{" + s + "}"); return s.Length + 1; } } class A { public myDelegate myDelegate; public event myDelegate myEvent; public void init() { myDelegate = new myDelegate(output); } public void invokeMydelegate(string s) { myDelegate(s); } public int fireEvent(string s) { int i = myEvent(s); return i; } private static int output(string s) { Console.WriteLine(s); return s.Length; } } delegate int myDelegate(string s); }