C#委托
1、声明一个委托类型,这个委托类型可以调用跟它签名相同(返回值跟参数列表)的函数。
2、可以把委托看作是一个存放多个函数地址的集合,里面的函数的签名就像声明集合的类型。
3、定义、调用
修饰符 delegate 返回值类型 委托名 ( 参数列表(可省略) );
//定义一个名为MyDelegate的委托,不带返回值,不带参数列表
public delegate void MyDelegate();
委托名 委托对象名 = new 委托名 ( 方法名 );
///创建一个名为md的委托对象,md还没赋值,调用时需要
///调用一个跟委托具有相同签名的方法赋值给md,md指向该方法,有点类似于指针
MyDelegate md = new MyDelegate();
4、委托可以跟泛型合用。
public delegate int DelCompare<T>(T t1,T t2);
5、多播委托、匿名委托、lambda表达式
委托可以同时指向多个函数,称之为多播委托。
int max = GetMax<int>(num1, delegate (int x, int y) { //匿名函数 return x - y; });
int max = GetMax<int>(num1, (int x, int y) => //Lambada表达式 { return x - y; });
class Program { //定义购买商品委托 public delegate void OrderDelegate(); static void Main(string[] args) { //实例化委托 OrderDelegate orderDelegate = new OrderDelegate(Order.BuyFood); //向委托中注册方法 orderDelegate += Order.BuyCake; //多播委托 orderDelegate += Order.BuyFlower;
orderDelegate += Order.BuyFood;
orderDelegate -=Order.BuyFood;
//调用委托 orderDelegate(); } } class Order { public static void BuyFood() { Console.WriteLine("购买快餐!"); } public static void BuyCake() { Console.WriteLine("购买蛋糕!"); } public static void BuyFlower() { Console.WriteLine("购买鲜花!"); } }
匿名委托并不能很好地实现代码的重用,匿名委托通常适用于实现一些仅需要使用一次委托中代码的情况,并且代码比较少。
补充:
Action 跟Func 委托:
系统已经封装好的委托类型,没有返回值的时候用Action,有返回值就用Func。
void Start() { Action<string> act = Init; act("hello world"); } private void Init(string str)//放发 { Debug.Log(str);//打印 } csdn.net/qq_39984000/article/details/115245134
void Start() { Func<string> MyFun1 = MyMethodA;//这样定义 就是 无参的Func 返回一个string Debug.Log(MyFun1());//执行 这个委托 Func<string,string> MyFun2 = MyMethodB;//这样定义 就是参数为string的Func 返回一个string值 Debug.Log(MyFun2("一个参数"));//执行 这个委托 //一次类推 Func<string, string,bool> MyFun3 = MyMethodC;//这样定义 就是2个参数为string的Func 返回一个bool值 Debug.Log(MyFun3("一个参数","二个参数"));//执行 这个委托 }

浙公网安备 33010602011771号