Delegate

一、什么是委托?

  委托是一种引用类型,它是函数指针的托管版本。在C#中,委托是一种可以把引用存储为函数的类型。委托可以引用实例和静态方法,而函数指针只能引用静态方法。委托的声明非常类似于函数,和函数不同的的是委托不带函数体,并且需要Delegate关键字。委托的声明指定了一个函数签名,其中包含参数列表和和一个返回类型。在定义了委托后,就可以声明该委托类型的变量,然后可以将这个变量初始化为与该委托有相同签名的函数进行引用,随后可以使用委托变量调用该函数。(ps:其实委托他丫的就是一个类,他的目的就是将方法可以作为其他方法的参数传递!)

  委托虽然与函数指针非常相似,但却不是指针。许多人把.NET中的委托理解为安全的函数指针,这是比较牵强的,委托实现的功能和函数指针非常类似的一点就是提供了程序回调机制。

二、委托四部曲:1、声明委托类型

            2、有一个方法包含了执行的代码

            3、创建委托实例

            4、调用委托实例

三、例子:(1)

using System;

namespace ConsoleApp
{
class Program
{
//1、声明委托类型
public delegate void AddDelete(int a, int b);
//2、有一个方法包含了执行的代码
public static void Add(int a, int b)
{
Console.WriteLine(a + b);
}
static void Main(string[] args)
{
//3、创建委托实例,使用了new 关键字,说明委托也是类,将方法名Add作为参数绑定到该委托实例
var adddelete = new AddDelete(Add);
//4、调用委托实例
adddelete(, );
Console.ReadKey();
}
}
}

  (2)使用匿名方法,如下,可以看到这样就不需要再定义一个Add函数了,

using System;

namespace ConsoleApp
{
class Program
{
public delegate void AddDelete(int a, int b); static void Main(string[] args)
{
AddDelete adddelete = delegate(int a, int b) { Console.WriteLine(a + b); };
adddelete(,);
Console.ReadLine();
}
}
}

四、C#中被委托的方法必须是静态的吗?

using System;

namespace ConsoleApp
{
class Program
{
public delegate void AddDelete(int a, int b);
private class MyClass
{
public void Add(int a, int b)
{
Console.WriteLine(a + b);
}
} static void Main(string[] args)
{
MyClass myClass=new MyClass();
var adddelete = new AddDelete(myClass.Add);
adddelete(, );
Console.ReadKey();
}
}
}

  通过上面的代码可以看出,委托既可以绑定静态方法也可以绑定实例方法。但是在绑定实例方法的时候,delegate的target属性就被设置为指向这个实例方法所属类型的一个实例对象。当绑定静态方法时,delegate的target属性就给NULL

五、什么是多播委托?

  每个委托都只包含一个方法调用,调用委托的次数与调用方法的次数相同。如果要调用多个方法,就需要多次显示调用这个委托。当然委托也可以包含多个方法,这种委托成为多播委托。

    调用过程中:1、多播委托包含一个以上方法的引用且必须是同类型的

          2、多播委托包含的方法必须返回void,否则会抛出run-time exception,并且不能带参数(但可以带引用参数)

    例子:

using System;

namespace ConsoleApp
{
public delegate int MyDel(int name);
class Program
{
static int Add1(int a)
{
var b = + a;
Console.WriteLine(b);
return b;
}
static int Add2(int a)
{
var b = - a;
Console.WriteLine(b);
return b;
}
static void Main(string[] args)
{
var add = new MyDel(Add1);
add += new MyDel(Add2);
Console.WriteLine(add());
Console.ReadKey();
}
}
}

也许,你看到这一段代码时,你会奇怪,+=不会给delegatesand重新赋值吗?

但是我想说你的担心是多余的,+=运算符,在我们之前的理解中,它具有赋值的作用,可这里为什么会与上边的代码 效果一样,与你的想象不一致,其实,这里的+=运算符被重载了 ,不再是我们一般理解的:

    int a=0,b=1;
   a+=b;//此时,a变成了 1

在使用委托时,+=将会被重载,它的作用变成了 在不影响已赋值委托变量的前提下,为已赋值的委托变量再次添加一个引用委托方法
 也就是说,每使用一次 +=运算符,委托变量就会被加入一个委托方法,比如原来 委托变量被赋值了,使用一次+=运算符后,委托变量也就同时作为两个 委托方法的委托了 ,而且,它们运行的先后顺序与添加的先后顺序一致。

ps:此文章是本人参考网上内容加上自己的理解整合而成,如无意中侵犯了您的权益,请与本人联系。

  

C#中的委托(delegate)(个人整理)的更多相关文章

  1. C#中的委托(Delegate)和事件(Event)

    原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...

  2. (转)C#中的委托(Delegate)和事件(Event)

    转自:http://blog.chinaunix.net/uid-576762-id-2733751.html   把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...

  3. C#中的委托 Delegate(委托 也叫代表,代表一类方法)

    1. 委托类似与 C或C++中的函数指针,但委托是 面向对象的,并且是类型安全的 详情可查看官方文档:https://msdn.microsoft.com/en-us/library/ms173172 ...

  4. .Net: C#中的委托(Delegate)和事件(Event)

    委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真 是太容易了,而没有过去的人每次 ...

  5. 谈C#中的Delegate

    引言 Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delegate这个特性,所以一直没有对它作整理.这两天,我再度翻阅了一些关于Delegate的资料 ...

  6. [转] C#中的delegate 和 event

    转至:here 终于会用c#中的delegate(委托) 作者:qq826364410 引言 Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delega ...

  7. C# 中的委托和事件

    觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...

  8. Objective-C中的委托(代理)模式

    我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...

  9. C# 中的委托和事件(转)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

随机推荐

  1. 第三篇 request篇

    每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...

  2. 使用python处理地理数据:Geopandas

    说句实话处理地理数据使用python还是比较麻烦的

  3. 程序一 用记事本建立文件src.dat,其中存放若干字符。编写程序,从文件src.dat中读取数据,统计其中的大写字母、小写字母、数字、其它字符的个数,并将这些数据写入到文件test.dat中。

    用记事本建立文件src.dat,其中存放若干字符.编写程序,从文件src.dat中读取数据,统计其中的大写字母.小写字母.数字.其它字符的个数,并将这些数据写入到文件test.dat中. #inclu ...

  4. vue_VueRouter 路由_路由器管理n个路由_并向路由组件传递数据_新标签路由_编程式路由导航

    路由:就是一个 key 与 value 的映射关系.key 就是 pathh 前台路由的 value 是 Component 组件对象 后台路由的 value 是一个 回调函数 普通链接: 会发送请求 ...

  5. [LeetCode] Largest Sum of Averages 最大的平均数之和

    We partition a row of numbers A into at most K adjacent (non-empty) groups, then our score is the su ...

  6. Reward List 赏金列表

    博主昨晚正在刷题,突然手机语音大声提示“微信支付收款到账”,把博主吓了一跳,打开一看,居然收到了第一笔打赏,还是博主最喜欢的数字,老开心了-感谢网友对于博主工作的认可与支持,多谢多谢!不管大家是物质打 ...

  7. Windows 2012 下Redmine安装和环境搭建

    公司在过去一年中处于高速发展创业期,对于技术管理和项目管理没有找到一个很好的管理工具,使用过Teanbition+禅道+SVM的集成管理工具,但是明显各工具之间联系性差,断层严重,不能很好的形成团队成 ...

  8. XSS 与 CSRF 跨站攻击

    先做个名词解释: XSS:跨站脚本(Cross-site scripting) CSRF:跨站请求伪造(Cross-site request forgery) 看了估计也不清楚什么意思吧? 那么,详细 ...

  9. vueX、vue中transition的使用、axios

    引入一篇好文章链接:看一遍就会的vuex文章;完!!! vue中transtion的使用:transition文章;完!!! axios的文章:axios;完!!!

  10. rpc轻量级框架实例