委托和事件
一、委托的使用
1:首先来看看委托的使用
1)传统的委托使用的分为三步。
1 /// <summary> 2 /// 定义委托 3 /// </summary> 4 /// <param name="x">变量 x</param> 5 /// <param name="y">变量 y</param> 6 /// <returns>返回一个 Int 值</returns> 7 public delegate int IntDelegate(int x, int y); 8 9 /// <summary> 10 /// Add 静态方法 11 /// </summary> 12 /// <param name="x">参数 x</param> 13 /// <param name="y">参数 y</param> 14 /// <returns>返回 Int 值</returns> 15 public static int Add(int x, int y) 16 { 17 return x + y; 18 } 19 20 /// <summary> 21 /// 入口函数 22 /// </summary> 23 /// <param name="args"></param> 24 public static void Main(string[] args) 25 { 26 IntDelegate delegt = new IntDelegate(Add); 27 Console.WriteLine(delegt.Invoke(3, 9)); 28 }
2)以下的三种方式展示两步解决委托的使用
1 /// <summary> 2 /// 实例化委托类 3 /// </summary> 4 public static void Test2() 5 { 6 IntDelegate delegt = delegate(int x, int y) { return x + y; }; 7 Console.WriteLine(delegt(4, 10)); 8 } 9 10 /// <summary> 11 /// 在上面的方法的基础上去掉 delegate 12 /// </summary> 13 public static void Test3() 14 { 15 IntDelegate delegt = (int x, int y) => { return x + y; }; 16 Console.WriteLine(delegt.Invoke(4, 50)); 17 } 18 19 /// <summary> 20 /// 在上面的方法的基础上去掉 delegate 和 return 21 /// </summary> 22 public static void Test4() 23 { 24 IntDelegate delegt = (x, y) => (x + y); 25 Console.WriteLine(delegt.Invoke(4, 50)); 26 }
2:再来看看 .NET 自己封装的委托— Action 、 Func
1)其区别: Action 是无返回值的;Func 是有返回值的,且返回值的类型是其最后一个参数类型(学艺不精,大牛请指教)
2)下面是 Func 的使用,下面的例子只支持2个参数,但是同样支持4个参数
1 /// <summary> 2 /// Add 静态方法 3 /// </summary> 4 /// <param name="x">参数 x</param> 5 /// <param name="y">参数 y</param> 6 /// <returns>返回 Int 值</returns> 7 public static int Add(int x, int y) 8 { 9 return x + y; 10 } 11 12 /// <summary> 13 /// Func 的使用,第三个Int 是返回值类型 14 /// </summary> 15 public static void Test5() 16 { 17 Func<int, int, int> func = (x, y) => Add(x, y); 18 Console.WriteLine(func.Invoke(102, 204)); 19 }
3)下面是 Action 的使用
1 /// <summary> 2 /// Sub 静态方法 3 /// </summary> 4 /// <param name="x"></param> 5 /// <param name="y"></param> 6 public static void Sub(int x, int y) 7 { 8 Console.WriteLine(x - y); 9 } 10 11 /// <summary> 12 /// Action 的使用 13 /// </summary> 14 public static void Test6() 15 { 16 Action<int, int> action = Sub; 17 action.Invoke(101, 94); 18 }
二、事件的使用
1 /// <summary> 2 /// 委托 3 /// </summary> 4 /// <param name="str">委托参数</param> 5 public delegate void Show(string str); 6 public class Program 7 { 8 /// <summary> 9 /// 事件 10 /// </summary> 11 public static event Show ShowEvent; 12 13 /// <summary> 14 /// 方法 ShowImg 15 /// </summary> 16 /// <param name="strImg"></param> 17 public static void ShowImg(string strImg) 18 { 19 Console.WriteLine("strImg: " + strImg); 20 } 21 22 /// <summary> 23 /// 方法 ShowMusic 24 /// </summary> 25 /// <param name="strMusic"></param> 26 public static void ShowMusic(string strMusic) 27 { 28 Console.WriteLine("strMusic: " + strMusic); 29 } 30 static void Main(string[] args) 31 { 32 ShowEvent += ShowImg; 33 Console.WriteLine(ShowEvent.GetInvocationList().Count()); 34 ShowEvent += ShowMusic; 35 Console.WriteLine(ShowEvent.GetInvocationList().Count()); 36 ShowEvent("图片"); 37 ShowEvent("音乐"); 38 } 39 }
细心的童鞋可能发现:
在调用的时候,我有时用委托构造方法,有时调用委托的虚方法 invoke 方法
其实是一样的,但是我还不知道为什么。。。 >..<...|| (大神指教)