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("一个参数","二个参数"));//执行 这个委托
    }

 

posted @ 2022-07-13 09:32  Darius丶段  阅读(56)  评论(0)    收藏  举报