一、定义
委托即是函数指针,(复习 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();
}