1.委托 关键字 delegate 声明(通俗了解,结合面向生活的思想---委托就是委托他人,是一个具体的命令或者指派、选择)
定义方法:
public delegate void xxxxEventHandler();
委托让我们可以把函数引用保存在变量中。这就像在 C++ 中使用 typedef 保存函数指针一样。
看看这个例子,你可以理解什么是委托:
例子:
pulic delegate int OperationEventHandler(int val1, int val2);
public int Add(int val1, int val2)
{
return val1 + val2;
}
public int Subtract (int val1, int val2)
{
return val1- val2;
}
public void Perform()
{
OperationEventHandler Oper;
Console.WriteLine("Enter + or - ");
string optor = Console.ReadLine();
Console.WriteLine("Enter 2 operands");
string opnd1 = Console.ReadLine();
string opnd2 = Console.ReadLine();
int val1 = Convert.ToInt32 (opnd1);
int val2 = Convert.ToInt32 (opnd2);
if (optor == "+")
Oper = new OperationEventHandler(Add);
else
Oper = new OperationEventHandler(Subtract);
Console.WriteLine(" Result = {0}", Oper(val1, val2));
2. 委托注意事项:
1、委托和方法必须具有相同的参数。
2、委托可以调用多个方法,即一个委托对象可以维护一个可调用方法的列表而不是单独的一个方法,称为多路广播(多播)。
3、使用+=和-=运算实现方法的增加和减少
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Delegate;
namespace Delegate
{
//第1步:定义委托类型
public delegate int CallEventHandler(int a, int b);
class SimpleMath
{
// 乘法方法
public int Multiply(int a, int b)
{
return a * b;
}
// 除法方法
public int Divide(int a, int b)
{
return a / b;
}
}
}
class Test
{
static void Main(string[] args)
{
//第2步:声明委托对象
CallEventHandler objCall;
// Math 类的对象
SimpleMath objMath = new SimpleMath();
// 第3步:创建委托对象,将方法与委托关联起来
objCall = new CallEventHandler(objMath.Multiply);
CallEventHandler objCall1 = new CallEventHandler(objMath.Divide);
//向委托增加一个方法
objCall += objCall1;
//向委托减去一个方法
//objCall -= objCall1;
// 调用委托实例,先执行objMath.Multiply,然后执行objMath.Divide,有注册顺序
int result = objCall(5, 3);
System.Console.WriteLine("结果为 {0}", result);
Console.ReadKey();
}
}
3.写法2
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 CallEventHandlerEventHandler(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)
{
//--------------------第一种写法------------------------//
//CallEventHandler objCallEventHandler = new CallEventHandlerEventHandler(SimpleMath.Multiply);
//CallEventHandler objCallEventHandler1 = new CallEventHandler(new SimpleMath().Divide);
//--------------------第二种写法------------------------//
//CallEventHandler objCallEventHandler = SimpleMath.Multiply;
//CallEventHandler objCallEventHandler1 = new SimpleMath().Divide;
//--------------------第三种写法------------------------//
//CallEventHandler objCallEventHandler = delegate(int a, int b)
//{
// return a * b;
//};
//CallEventHandler objCallEventHandler1 = delegate(int a, int b)
//{
// return a / b;
//};
//--------------------第四种写法------------------------//
//CallEventHandler objCallEventHandler =((int a,int b)=> { return a*b;});
//CallEventHandler objCallEventHandler1 = ((int a, int b) => { return a / b; });
//--------------------第五种写法------------------------//
Func<int, int, int> objCallEventHandler = ((a, b) => { return a * b; });
Func<int, int, int> objCallEventHandler1 = ((a, b) => { return a / b; });
Action<int, int> ob = ((a, b) => { Console.WriteLine(a * b); });
ob(5, 3);
//----------------------------------------------------//
int result = objCallEventHandler(5, 3);
int result1 = objCallEventHandler1(5, 3);
System.Console.WriteLine("结果1为 {0},结果2为{1}", result,result1);
Console.ReadKey();
}
}
}