委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法。
1、定义委托类型
[访问修饰符]delegate 返回类型 委托名(形参);
2、声明委托对象
委托名 委托实例名;
3、创建委托对象(确定与哪些方法进行绑定)
委托实例名=new 委托名(某个类的方法)
4、使用委托调用方法
委托实例名(实参)
1、委托和方法必须具有相同的参数。
2、委托可以调用多个方法,即一个委托对象可以维护一个可调用方法的列表而不是单独的一个方法,称为多路广播(多播)。
3、使用+=和-=运算实现方法的增加和减少
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using Delegate;
-
- namespace Delegate
- {
-
- public delegate int Call(int num1, int num2);
- class SimpleMath
- {
-
- public int Multiply(int num1, int num2)
- {
- return num1 * num2;
- }
-
-
- public int Divide(int num1, int num2)
- {
- return num1 / num2;
- }
- }
- }
- class Test
- {
- static void Main(string[] args)
- {
- Call objCall;
-
- SimpleMath objMath = new SimpleMath();
-
- objCall = new Call(objMath.Multiply);
-
- Call objCall1 = new Call(objMath.Divide);
- objCall += objCall1;
-
-
-
- int result = objCall(5, 3);
- System.Console.WriteLine("结果为 {0}", result);
- Console.ReadKey();
- }
- }
写法:
1、委托 委托名=new 委托(会调用的方法名); 委托名(参数);
2、委托 委托名 =会调用的方法名; 委托名(参数);
3、匿名方法
委托 委托名=delegate(参数){会调用的方法体};委托名(参数);
4、拉姆达表达式
委托 委托名=((参数1,。。参数n)=>{会调用的方法体});委托名(参数);
5、用Action<T>和Func<T>,第一个无返回值
Func<参数1, 参数2, 返回值> 委托名= ((参数1,参数2) => {带返回值的方法体 });返回值=委托名(参数1,参数2);
贴代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using @delegate;
-
- namespace @delegate
- {
- public delegate int Call(int num1, int num2);
- class SimpleMath
- {
-
- public static int Multiply(int num1, int num2)
- {
- return num1 * num2;
- }
-
-
- public int Divide(int num1, int num2)
- {
- return num1 / num2;
- }
- }
- class Test
- {
- static void Main(string[] args)
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Func<int, int, int> objCall = ((a, b) => { return a * b; });
- Func<int, int, int> objCall1 = ((a, b) => { return a / b; });
- Action<int, int> ob = ((a, b) => { Console.WriteLine(a * b); });
- ob(5, 3);
-
- int result = objCall(5, 3);
- int result1 = objCall1(5, 3);
- System.Console.WriteLine("结果1为 {0},结果2为{1}", result,result1);
- Console.ReadKey();
- }
- }
- }
拓展:
C# 3.0 引入了 Lambda 表达式,这种表达式与匿名方法的概念类似,但更具表现力并且更简练。这两个功能统称为“匿名函数”。 通常,针对 .NET Framework 版本 3.5 及更高版本的应用程序应使用 Lambda 表达式。
更多见:
https://msdn.microsoft.com/zh-cn/library/ms173172.aspx
https://msdn.microsoft.com/zh-cn/library/bb882516.aspx