一、委托一般作为方法的参数或者返回值,或者使用多播委托(注册多个方法,可以全部触发)

1.示例:根据对于字符串不同的处理方法逻辑private delegate void PrintString(string str);static void PrintStr( PrintString print,string str ){print(str);}static void Method1(string str) {Console.WriteLine(str);}static void Method2(string str){Debug.WriteLine(str);}static void Main(string[] args)
{PrintString method = Method1;PrintStr(method,"Test");method = Method2;PrintStr(method,"Test");Console.ReadKey();}

二、泛型委托

Action-Action<T>

   class Program {static void PrintString(){Console.WriteLine("hello world.");}static void PrintInt(int i){Console.WriteLine(i);}static void PrintString(string str){Console.WriteLine(str);}static void PrintDoubleInt(int i1, int i2){Console.WriteLine(i1+i2);}static void Main(string[] args){//Action a = PrintString;//action是系统内置(预定义)的一个委托类型,它可以指向一个没有返回值,没有参数的方法//Action<int> a=PrintInt;//定义了一个委托类型,这个类型可以指向一个没有返回值,有一个int参数的方法//Action<string> a = PrintString;//定义了一个委托类型,这个类型可以指向一个没有返回值,有一个string参数的方法 在这里系统会自动寻找匹配的方法Action<int, int> a = PrintDoubleInt;a(34, 23);Console.ReadKey();//action可以后面通过泛型去指定action指向的方法的多个参数的类型 ,参数的类型跟action后面声明的委托类型是对应着的}}

Func<T>  

  class Program {static int Test1(){return 1;}static int Test2(string str){Console.WriteLine(str);return 100;}static int Test3(int i, int j){return i + j;}static void Main(string[] args){//Func<int> a = Test1;//func中的泛型类型制定的是 方法的返回值类型//Console.WriteLine(a());//Func<string, int> a = Test2;//func后面可以跟很多类型,最后一个类型是返回值类型,前面的类型是参数类型,参数类型必须跟指向的方法的参数类型按照顺序对应Func<int, int, int> a = Test3;//func后面必须指定一个返回值类型,参数类型可以有0-16个,先写参数类型,最后一个是返回值类型int res = a(1, 5);Console.WriteLine(res);Console.ReadKey();}}

泛型委托应用:冒泡排序扩展

class Employee {public string Name { get; private set; }public int Salary { get; private set; }public Employee(string name, int salary){this.Name = name;this.Salary = salary;}//如果e1大于e2的话,返回true,否则返回falsepublic static bool Compare(Employee e1, Employee e2){if (e1.Salary > e2.Salary) return true;return false;}public override string ToString(){return Name + ":" + Salary;}}

View Code

   class Program {static void Sort(int[] sortArray){bool swapped = true;do{swapped = false;for (int i = 0; i < sortArray.Length - 1; i++){if (sortArray[i] > sortArray[i + 1]){int temp = sortArray[i];sortArray[i] = sortArray[i + 1];sortArray[i + 1] = temp;swapped = true;}}} while (swapped);}static void CommonSort<T>(T[] sortArray, 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);}static void Main(string[] args) {//int[] sortArray = new int[]{123,23,12,3,345,43,53,4};//Sort(sortArray);//foreach (var temp in sortArray)//{//    Console.Write(temp+" ");//}Employee[] employees = new Employee[]{new Employee("dsf",12), new Employee("435dsf",234), new Employee("234dsf",14), new Employee("ds234f",234), new Employee("dssfdf",90)};CommonSort<Employee>(employees,Employee.Compare);foreach (Employee em in employees){Console.WriteLine(em);}Console.ReadKey();}}

View Code

多播委托:(可以注册多个方法给委托,也可以注销已注册的方法)

方法:

     static void T1(){Console.WriteLine("ok");}static void T2(){Console.WriteLine("ook");}static void T3(){Console.WriteLine("oook");}static void M1(string msg){Console.WriteLine(msg);}static void M2(string msg){Console.WriteLine(msg);}static void M3(string msg){Console.WriteLine(msg);Console.WriteLine("第3个方法。。");}static void M4(string msg){Console.WriteLine(msg);}static void M5(string msg){Console.WriteLine(msg);}

View Code

示例:

 class Program{static void Main(string[] args){#region 多播委托////一般第一个要使用=赋值,后续的方法可以使用+=来赋值。//Action<string> action = M1;//action += M2; //表示添加一个委托的引用 //action += M3;//action += M4;//action += M5;//action -= M3;//表示去除一个委托的引用if(action!=null){//防止为空,报错action("xxx");//一次性触发全部的方法。调用顺序不一定哦。            }//Console.ReadKey();#endregionMyDelegate md = new MyDelegate(T1);//为什么这么写呢?等下取消注释上面的代码反编译之后放截图就知道md = (MyDelegate)Delegate.Combine(md, new MyDelegate(T2), new MyDelegate(T3));// md();  下面的方法是获取所有注册的方法逐个调用Delegate[] delegates = md.GetInvocationList();for (int i = 0; i < delegates.Length; i++){(delegates[i] as MyDelegate)();}Console.ReadKey();//使用队列试试//Queue<MyDelegate> queue = new Queue<MyDelegate>();//queue.Enqueue(new MyDelegate(T1));//queue.Enqueue(T2);//queue.Enqueue(T3);//queue.Dequeue();//queue.Dequeue();//queue.Dequeue();
}

多播委托反编译:可看到,本质就是调用Delegate.Combine方法组装起来的,调用的时候为什么能全部触发已注册的方法?可以看到编译器调用GetInvocationList方法之后得到委托父类数组循环逐个调用; 事件的本质我们稍后探讨,跟多播密不可分

转载于:https://www.cnblogs.com/entclark/p/7966765.html

委托应用及泛型委托和多播委托相关推荐

  1. 很久没上来写点东西了,今天把N年前的代码看了一遍。随手写了点寄托哀思--多播委托...

    using  System; // 委托类似于C++中的函数指针,不同的是委托可以包含一个顺序的委托集合. // 在C#类型封装中,对于不同类型的单个函数的暴露建议使用委托而不要使用接口. // 委托 ...

  2. 委托、lamda表达式..委托概念-匿名函数-泛型委托-Lamda表达式-多播委托

    委托 一.什么是委托? 将一个方法作为参数传递给另一个方法(参数类型为委托delegate).   声明一个委托类型. 委托所指向的函数必须跟委托具有相同的的签名(参数个数.参数类型.返回值一样). ...

  3. C语言中的函数指针、函数的直接/间接调用、C# 委托(自定义委托、内置泛型委托、委托的实例化、委托的一般使用(模板方法、回调方法)、泛型委托、多播委托、同步/异步使用委托)

    文章目录 C语言中的函数指针 函数的直接调用与间接调用 Java中没有与委托对应的功能实体 C# 委托 C# 自定义委托类型 C# 内置泛型委托类型 委托的实例化 委托也支持泛型的使用 委托的一般使用 ...

  4. 第九节:委托和事件(1)(委托的发展历史、插件式编程、多播委托)

    一. 委托的发展历史和基本用法 说起委托,每个人可能都会对他有不同的理解,结合实战中委托的使用,我对其理解是:委托和类一样,是用户的一个自定义类型,委托可以有参数.有返回值,委托的关键字是delega ...

  5. C#笔记11多播委托、事件、设计模式(观察者模式)

    文章目录 多播委托 初步理解多播委托为委托列表 报社发报案例 增加接口编程改善案例 再用委托类型对上例进行改善 委托链的异常 事件 提供封装,程序更健壮 提供更加抽象的事件用法 System.Even ...

  6. C#委托,多播委托,匿名委托,事件

    委托 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 委托是方法的抽象,它存储的就是一系列具有相同签名和返回类型的方法的地址.调用委托的时候,委 ...

  7. 委托、多播委托(MulticastDelegate)

    委托.多播委托(MulticastDelegate) 多播委托(MulticastDelegate)继承自 Delegate ,表示多路广播委托:即,其调用列表中可以拥有多个元素的委托.实际上,我们自 ...

  8. 用boost.signal实现多播委托

    使用boost.signal boost.signal提供了一个多播委托机制,通过它可以非常容易的实现观察者模式: void print_sum(float x, float y)     {     ...

  9. java委托事件与观察者模式_多播委托与观察者模式联合使用,以及委托与事件的区别...

    首先我们先看一下多播委托: 使用委托时,首先我们声明委托,委托语法一共有四种类型,分别时有参,无参,以及有无参数返回值. 1 public class DelegateShow //: System. ...

  10. 多播委托(multicast delegate)

    还是老规矩,先看代码:) using System; class MulticastTester {     delegate void Greeting();          public sta ...

最新文章

  1. 常用的数据结构-链表
  2. python的logging模块,记录所发生的异常。
  3. 斐波那契的数列的计算python-python斐波那契数列的计算方法
  4. NYOJ 289 苹果
  5. [Silverlight]奇技银巧系列-5 捕获路由事件
  6. java byte 拓展_Java项目中如何扩展第三方jar包中的类?
  7. 40 个重要的 HTML5 面试问题及答案
  8. php的crypt,php使用crypt()函数进行加密
  9. 一年级学python_你是如何自学 Python 的?
  10. Oracle 相关知识点结构图
  11. 筑墙——只需一点点安全常识就能阻止网络犯罪
  12. SVN比较两个文件差异
  13. ORB-SLAM(一)简介
  14. 如何有效管理远程开发团队
  15. java将日期转换成大写_将util.Date转换为大写(农历)时间
  16. 居民供暖室温无线监测系统
  17. CampusBulider(模模搭)学习笔记6:室内搭建
  18. div盒模型宽高计算
  19. 成功的条件:高人指点、贵人相助、小人监督、个人奋斗
  20. 关闭win10的繁体字快捷键ctrl+shift+f

热门文章

  1. 凭几句话的方案,你什么也做不了
  2. 下载debian老版本的链接
  3. 同等条件下,杂交水稻是否增产?
  4. 身高回归现象是否真的存在?
  5. html flash背景透明写法,如何让Flash不遮挡HTML div元素的技巧
  6. java xlsx读写_java中怎样从Excel中读写数据
  7. python的序列类型包括_python基础之常用序列类型(字符串)
  8. tx2开发板接口详解_Linux CAN编程详解
  9. arcgis水文分析_值得收藏!用DEM做水文分析前,你还需要储备的知识
  10. 泰拉瑞亚测试速度的软件,泰拉瑞亚1.4工具速度是多少 泰拉瑞亚1.4工具速度介绍-游侠网...