delegate声明的是System.MulticastDelegate类。
public delegate int BinaryOp(int x, int y); // 静态方法 BinaryOp b = new BinaryOp(SimpleMath.Add); // 实例方法 BinaryOp b = new BinaryOp(m.Add); // 这样调用都可以 b(10, 10); b.Invoke(10, 10);
使用 += 和 -= 运算符添加、移除方法。
指向方法的返回类可以有继承关系。
指向方法的参数可以有继承关系。
public delegate void MyGenericDelegate<T>(T arg);
使用event关键字和+=、-=运算符简化事件注册和移除。
泛型EventHandler
c1.AboutToBlow += delegate { aboutToBlowCounter++; Console.WriteLine("Eek! Going too fast!"); }; c1.AboutToBlow += delegate(object sender, CarEventArgs e) { aboutToBlowCounter++; Console.WriteLine("Message from Car: {0}", e.msg); };
// 注册时间处理程序 m.ComputationFinished += ComputationFinishedHandler; // 显示转换委托 SimpleMath.MathMessage mmDelegate = (SimpleMath.MathMessage)ComputationFinishedHandler;
匿名方法的简单形式,简化委托的使用。
// Traditional delegate syntax. c1.OnAboutToBlow(new Car.AboutToBlow(CarAboutToBlow)); c1.OnExploded(new Car.Exploded(CarExploded)); // Use anonymous methods. c1.OnAboutToBlow(delegate(string msg) { Console.WriteLine(msg); }); c1.OnExploded(delegate(string msg) { Console.WriteLine(msg); }); // Using lambda expression syntax. c1.OnAboutToBlow(msg => { Console.WriteLine(msg); }); c1.OnExploded(msg => { Console.WriteLine(msg); }); // 不带类型 m.SetMathHandler((string msg, int result) => { Console.WriteLine("Message: {0}, Result: {1}", msg, result); }); // 带类型 m.SetMathHandler((msg, result) => { Console.WriteLine("Message: {0}, Result: {1}", msg, result); }); // 无参数 VerySimpleDelegate d = new VerySimpleDelegate(() => { return "Enjoy your string!"; });