博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
理解委托
阅读量:5328 次
发布时间:2019-06-14

本文共 1610 字,大约阅读时间需要 5 分钟。

委托是一种类型.委托像String,像Integer,像我们定义的Class一样,是一种类中.

委托是一种引用方法的类型.与委托的签名(参数和返回值)匹配的方法都可以分配给该委托.方法可以是静态方法,也可以是实例方法.

一旦为委托分配了方法,委托将与该方法具有相同的行为.委托方法的调用可以像其他方法一样,具有参数和返回值.

使用委托,可以将多个方法绑定到同一个委托变量.当调用此变量时,可以依此调用所绑定的方法.

注意:

在方法重载的上下文中,方法的签名不包括返回值,但是在委托的上下文中,签名包括参数和返回值.

委托的特点:

1.委托类似于方法指针.

2.委托允许将方法作为参数进行传递

3.委托可用于方法回调.

4.委托可以链接在一起.

5.方法不必与委托签名完全相同

6.可以将匿名函数作为参数传递.

注意,我们在上面提到,与委托签名匹配的方法都可以分配给该委托,而不是说与委托签名相同的方法都可以分配给该委托. 

对于第5个特点,我们来看:委托中的协变和逆变

协变可以将委托与具有返回类型的方法一起使用,其中这些返回类型继承自委托的返回类型.

协变允许方法具有的派生返回类型比委托中定义的更多.

例:

public class Anmail{        }public class Cat : Anmail{    public static Cat GetCat()    {        HttpContext.Current.Response.Write("Get a cat!
"); return new Cat(); }}public class Dog : Anmail{ public static Dog GetDog() { HttpContext.Current.Response.Write("Get a dog!
"); return new Dog(); }}public delegate Anmail GetAnmails();protected void Page_Load(object sender, EventArgs e){ GetAnmails get = new GetAnmails(Cat.GetCat); get += Dog.GetDog; get();}

结果:

逆变可以将委托与具有某个类型的参数的方法一起使用.其中这些参数委托签名的基类型.

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

public class Anmail{    public string Name { get; set; }}public class Cat : Anmail{}public class Dog : Anmail{}public delegate void GetAnmails(Anmail an);someclass{    protected void Page_Load(object sender, EventArgs e)    {        Cat c = new Cat() { Name = "Cat" };        Dog g = new Dog() { Name = "Dog" };        GetAnmails get = new GetAnmails(GetName);        get(c);        get(g);    }    public void GetName(Anmail an)    {        Response.Write(an.Name + "
"); }}

结果:

转载于:https://www.cnblogs.com/loveYN/p/4509660.html

你可能感兴趣的文章
正则表达式
查看>>
arcgis api 4.x for js 结合 Echarts4 实现散点图效果(附源码下载)
查看>>
YTU 2625: B 构造函数和析构函数
查看>>
apache自带压力测试工具ab的使用及解析
查看>>
加固linux
查看>>
WPF中Image显示本地图片
查看>>
Hyper-V虚拟机上安装一个图形界面的Linux系统
查看>>
js千分位处理
查看>>
字符串类型的相互转换
查看>>
基础学习:C#中float的取值范围和精度
查看>>
Vim配置Node.js开发工具
查看>>
web前端面试题2017
查看>>
ELMAH——可插拔错误日志工具
查看>>
MySQL学习笔记(四)
查看>>
【Crash Course Psychology】2. Research & Experimentation笔记
查看>>
SOPC Builder中SystemID
查看>>
关于 linux 的 limit 的设置
查看>>
HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
查看>>
vim中文帮助教程
查看>>
MySQL基础3
查看>>