委托、lambda表达式、事件
委托【Delegate】
简介
C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。
声明委托
委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。
例如,假设有一个委托:
public delegate int MyDelegate (string s);
表示返回值为int类型,参数仅有一个为字符串的委托
实例化委托
一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。例如:
class Program { public delegate int Dal(int x, int y); static void Main() { Program pro = new Program(); Dal dal = new Dal(pro.swap); dal.Invoke(1, 2); Console.ReadLine(); } public int swap(int x, int y) { Console.WriteLine("11"); return 2; } }
Action 和 Func
Action:表示引用一个 void 的方法
Calculator ca = new Calculator(); Action action = new Action(ca.Report); class Calculator { public void Report() { Console.WriteLine("I HAVE 3 METHODS"); } public int Add(int a, int b) { int result = a + b; return result; } public int Sub(int a, int b) { int result = a - b; return result; } }
Func:允许调用带返回类型的方法
Func<int, int, int> func1 = new Func<int, int, int>(ca.Add); Console.WriteLine(func1.Invoke(1, 2)); // 调用加法 class Calculator { public void Report() { Console.WriteLine("I HAVE 3 METHODS"); } public int Add(int a, int b) { int result = a + b; return result; } public int Sub(int a, int b) { int result = a - b; return result; } }
多播委托【必须返回void】
class Program { static void Main() { Calculator ca = new Calculator(); Action action1 = ca.Report1; Action action2 = ca.Report2; Action action3 = ca.Report3; Action action = action1 + action2 + action3; action(); Console.ReadLine(); } } class Calculator { public void Report1() { Console.WriteLine("I HAVE 1 METHODS"); } public void Report2() { Console.WriteLine("I HAVE 2 METHODS"); } public void Report3() { Console.WriteLine("I HAVE 3 METHODS"); } }
Lambda表达式【与委托存在】
- delegate委托
delegate int Trantformer(int i); Trantformer sqr = x => x * fation; Console.WriteLine(sqr(3)); // 30
- Action委托
Action<int, int> action = (x, y) => Console.WriteLine(x * y);
- Func委托
Func<int, int, int> func =(int x, int y) => x * y;