委托

一、定义

委托即是函数指针,(复习 typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型 typedef为类型取别名)委托类型是变量,可以作为参数传递。

二、声明

格式

Delegate [函数返回值_属于函数签名] [函数名_委托名] ([函数返回值_属于函数签名],[函数返回值_属于函数签名]);

三、定义委托变量

声明了委托类型然后定义委托变量,和定义其他变量一样。

类型名 变量名;

但请注意委托以函数签名区分不同类型的委托。

四、系统预定义委托

1、Action //指向无返回值 无参函数。Action<T,T> //指向带T类型参数无返回值的函数,每个T类型可以不同,T个数最大16个。当委托指向一个重载函数时,系统会自动匹配。

2、Func //指向带参带返回值的函数,必须带饭回值。Func<T,T>//最后一个代表返回值类型,其他的代表参数。

五、使用委托作为参数的示例

重写冒泡排序

static void CommonSort<T>(T[] sorArray, Func<T,T.bool> compareMethod){
    bool swapped = true;
    do{
        swapped = false;
        for(int i = 0; i < sortArray.Length - 1; i++){
            if(compareMethod(sortArray[i],sortArray[i + 1])){
                T temp = sortArray[i];
                sortArray[i] = sortArray[i + 1];
                sortArray[i +1] = temp;
                swapped = true;
            }
        }
    }while(swapped);
}
//委托compareMethod得到俩个T类型参数 返回比较结果bool型的函数。

六、多播委托

多播委托即为一个委托引用多个函数,使用 += 添加函数引用,使用 -= 删除函数引用。当委托持有的函数引用为零时调用委托会出现空指针异常。使用GetInvocationList()得到委托所持有的函数引用数组,遍历委托数组时使用DynamicInvoke调用函数。

void test1(){};
void test2(){};
void test3(){};
Action I = test1;
I += test2;
I += test3;
Delegate[] delegates = I.GetInvocaticon();
foreach(delegate i in delegates){
    i.DynamicInvoke();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值