1、委托:其实就是方法的多态,可以更确切的说是方法的指针

2委托是引用类型,这与类和接口相似。

3一个委托可以指向多个方法,方法的签名相同,委托才能指向它

4接口只能一次可以指向一个实例,而委托可以指向多个方法;此刻调用一个委托可以调用多个方法,也即是委托链

5、使用委托的步骤:

步骤1:声明委托 

1定义委托:可访问性 delegate 返回类型 (参数列表);
        2定义方法:可访问性 返回类型 (参数列表)

//以上两点根据参数类型和返回类型进行匹配,必须两者相同才能委托指向方法,也即函数的签名必须相同

public delegate void Job();

注意:其实委托相当于一个类所以定义委托一定要定义在方法的外面。

步骤2:创建委托调用的方法

//创建一个类,里面包含两个方法

class School

{

public void teacher()

{

Console.WriteLine("老师的工作是教学生学习!");

}

public void student()

{

Console.WriteLine("学生的工作是好好学习!");

}

}

步骤3:调用委托进而调用指向的方法

static void Main(string[] args)

{

School school = new School();

Job j = new Job(school.teacher); //实例化委托的时候必须指明其构造函数的参数,该参数不是值,不是引用,而是要指向方法的方法名

j += new Job(school.student); //继续加入委托链,其实相当于加入到委托数组里面,就像是一个方法数组,即数组里面存储了多个方法

Console.WriteLine("此刻该委托链中有{0}个方法",j.GetInvocationList().Length);

// j.GetInvocationList().Length调用委托的一个方法获取委托数组的长度,也即获得委托方法的个数。

j();

j -= new Job(school.student); //当然也可以从委托链中减去相应不想用的方法

Console.WriteLine("此刻该委托链中有{0}个方法", j.GetInvocationList().Length);

j();

}

5、委托的广播

使用+=委托中添加一个方法,使用- =使委托中减少一个方法,其实委托链就存在一个委托数组中,数组中存的是方法的引用。+=相当于添加一个委托的引用,-=相当于减少一个委托的引用。

单路广播:一个委托指向一个方法

多路广播:一个委托指向多个方法

注意:对于单路广播可以使用返回值,而对于多路广播,方法的返回值可能就不知一个,所以一般不建议带返回值,若必须有那么委托接收的是委托链最后的那个方法的返回值。 

6、委托类的成员

      以下方法可以简单的了解下,是用编程的方式实现委托的创建,添加委托的方法,减去等。

7、委托增强

1、匿名方法:字面上讲没有名字的方法,能省略参数列表,意味着可以将匿名方法转换为带有各种签名的委托。可以把代码块传递作为委托的参数,而这个代码块还是相当于原来类里面的一个方法。好处:通过匿名方法不必创建单独的一个方法,创建类,减少了实例化委托所需要的代码系统开销。

如:使用匿名方法实现老师工作的方法。

Job jobdelegate = delegate()

{

Console.WriteLine("老师的工作是教学生学习!"); };

jobdelegate();//使用该委托

仅仅使用一次的方法一般不要写在类里面,避免冗余,再如来个数相加:

public delegate int Add(int a, int b);//定义委托

Add add = delegate(int m, int n)

{

return m + n;

};

int result=add(1,2);

Console.WriteLine(result);

8、协变和逆变

协变和逆变都是与继承有关系的

(1)协变:允许方法具有的派生返回类型比委托中定义的多,比如说:

定义两个类,男人继承于人类:class people{}; class men:people{};

定义委托:public delegate  people  MethodPeople();

委托可以返回people,也可以返回men;即 MethodPeople  m1=delegate(){return man;};

可以这么简单的理解:委托类型是父类类型,而委托调用方法时方法返回类型可以使子类类型,当然也可以是父类类型。

(2)逆变:允许方法具有派生类参数类型比委托类型中的更少

字面上就能理解是和逆变相反的,说白了就是委托定义的子类类型或者参数为子类类型,而返回的可以使父类类型,或者参数传入的时父类类型。

个人理解:其实这就是方法返回类型和方法参数的多态,仅做参考。

协变和逆变用的地方不是很多,简单了解就行。

C#的基础琐碎总结-----委托相关推荐

  1. WindowsPhone基础琐碎总结-----数据绑定(一)

    一.什么是数据绑定     官方这样解释:数据绑定是在应用程序 UI 与业务逻辑之间建立连接的过程.简单的理解就是通过数据绑定的方式实现了后台数据和前台UI元素的关联,可以比喻成UI元素和数据源的桥梁 ...

  2. (转)WindowsPhone基础琐碎总结-----数据绑定(一)

    原文地址:http://www.cnblogs.com/fuchongjundream/archive/2012/04/08/2437803.html 一.什么是数据绑定     官方这样解释:数据绑 ...

  3. 【转】.NET正则基础之——正则委托

    源地址 1        概述 一般的正则替换,只能对匹配的子串做简单的处理,且只能是做string类型的处理之后,作为替换文本替换匹配子串,可以实现的功能比较有限..NET的Replace()方法中 ...

  4. oracle基础琐碎总结-----Where和Having的区别与联系

    Where和Having都是对查询结果的一种筛选,说的书面点就是设定条件的语句.下面分别说明其用法和异同点.注:本文使用字段为oracle数据库中默认用户scott下面的emp表,sal代表员工工资, ...

  5. Asp.net基础概念之 委托

    委托的概念 委托实际上是类(一个貌似函数一样的类),我们已经使用函数指针很多年了--函数指针也被称为过程类型,但是它们的实现都不是类.它们是单独的函数指针的简单实例.委托是包含这些功能的类,委托类通过 ...

  6. 30天C#基础巩固------了解委托,string练习

    ---->了解委托. 生活中的例子:我要打官司,我需要找一个律师,法庭上面律师为当事人辩护,它真正执行的是当事人的陈词,这时律师 就相当于一个委托对象.当事人则委托律师为自己辩解. C#中的委托 ...

  7. C# 打好基础图文详解

    C# 编程语言是.Net 平台开发的基础,现在已经发展到了4.0的版本,其中有很多我们不常用的语法和关键字,在这里我们会深入的研究C#语言中的概念和很多我们所不常用的关键字,打好语言基础. 目录 委托 ...

  8. Metasploit漏洞利用基础教程要出版了

    Metasploit漏洞利用基础教程要出版了 我们的Metasploit漏洞利用基础教程已经委托机械工业出版社出版.出版书名为<从实践中学习Metasploit 5渗透测试>.预计上市时间 ...

  9. .NET 委托与事件

    "委托"基础 含义: 委托(Delegate):是.NET Framework对C#和VB.NET等面向对象编程语言特性的一个重要扩充. 是.NET中的一些重要技术,如事件.异步调 ...

最新文章

  1. @Controller与@RestController区别
  2. 软件过程与项目管理(作业一)
  3. boost::spirit::karma::detail::format_manip相关的测试程序
  4. 缓存击穿/穿透/雪崩
  5. 学微信,抖音也上线PC版
  6. 存储高手速成:推荐10个存储技术网站和论坛
  7. kindeditor编辑器
  8. 数据中台是什么?数据中台应包含什么?来听听袋鼠云合伙人张旭的回答!
  9. 调用JS函数的内部函数
  10. java exchange类,JAVA5---Exchange使用
  11. 解决Invalid bound statement (not found): com.hengjun.mapper.UserMapper.selectByExample,
  12. 什么是微分,dy又是什么
  13. Excel取消工作簿密码【忘记工作簿密码的解决方法】
  14. Vue实现二选一、菜单更多功能:
  15. 利用scrapy采集酷狗音乐网站的音乐信息并保存本地MongoDB数据库
  16. (清风)数学建模:模糊分析法(二)应用
  17. google 工具 gflags
  18. Linux操作系统的介绍和使用
  19. 自主开发项目说明(新锐售楼管理系统)
  20. 金融大亨的十二条人生信条

热门文章

  1. 7.3 rpm工具用法
  2. Spark版本定制第12天:Executor容错安全性
  3. iOS开发 解决UITapGestureRecognizer手势与UITableView的点击事件的冲突
  4. Mac OS X10.11(OS X EI Capitan)安装程序下载
  5. android Java BASE64编码和解码一:基础
  6. Redmine Feedback
  7. 【STM32 .NET MF开发板学习-29】摄像头蓝牙图像远程获取
  8. 组策略轻松实现软件发布,Active Directory系列之二十二
  9. withRouter组件
  10. 用javascript进行一个简单的机器学习小实例