1. 委托类似与 C或C++中的函数指针,但委托是 面向对象的,并且是类型安全的

详情可查看官方文档:https://msdn.microsoft.com/en-us/library/ms173172.aspx

2. 委托 就相对与 一类方法 (即方法类,或者方法接口)

而这一类方法都具有相同的 修饰符、形参以及 返回值类型

2.1. 委托 既是方法:

声明委托的方式如下:在修饰符后加上 delegate ['dɛlɪɡət]关键字

public delegate void Del(string message);

           从格式上看,它与方法的声明极为相似,就是多了个 delegate关键字而已

表示声明了一类,修饰符为public、一个string类型形参的、没有返回值的方法

2.2. 但 委托 不是普通的方法,因为 它也是类,

所以委托只能声明,而不能定义,如不能这样写:

private delegate void Doing(string name){
System.Windows.MessageBox.Show();
}

  2.3. 实例化委托,调用委托

 //声明一个void, 形参是string的委托
public delegate void Del(string name); //定义个个cut方法
public void cut(string name)
{
System.Windows.MessageBox.Show("fuck " + name);
}
//实例化委托,传的参数是一个方法的名字,这里是cut
Del a = new Del(cut);
a("CCC");//调用委托,相当于调用cut("CCC");

3. 委托 有什么用,搞这么复杂有什么意思

3.1. 将方法名作为方法参数传递,提高代码的多变性和灵活性,如下:

public delegate void SayHello();

public void SayInEnglish(){
toSay = "Hello";
} public void SayInChinese(){
toSay = "你好";
} public void HelloToSomebody(SayHello say){//将方法作为参数来传递
say(toSay);
System.Windows.MessageBox.Show(toSay);
}

      以及:

       public delegate void Save(string word);

        public void SaveTime(string str)
{
string abc = "abc";
System.Windows.MessageBox.Show("我做我的事情 "+str);//WPF
} public void SaveNothing(string str)
{
System.Windows.MessageBox.Show("没事可做啊 "+str);
} public void HelloToSomebody(Save save)
{
save("试一试");
} public static void main(string[] args){ Save s = new Save(SaveTime);
Save s2 = new Save(SaveNothing);
HelloToSomebody(s);
HelloToSomebody(s2);
} /////////////////////////////////
结果是: 我做我的事情 试一试
没事可做啊 试一试

4. 委托 的多播 (Multicasting of a Delegate) "+="、"-="

using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
} public static int MultNum(int q)
{
num *= q;
return num;
}
public static int getNum()
{
return num;
} static void Main(string[] args)
{
// 创建委托实例
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
nc = nc1;
nc += nc2;//到这里,nc其实绑定了2个委托,调用时会按绑定的顺序执行
// 调用多播
nc(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}
}
} ////////////////////////////////////
结果是: Value of Num: 75

  注意:委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。

"-" 运算符可用于从合并的委托中移除组件委托。

总结:

1. 委托 即使 方法,又是 类(一种特殊的方法:可以方便统一调用;特殊的类,能当方法来用的类,这也够特殊了吧),委托是一类方法

2. 委托 先声明,后实例化,然后才能调用,委托的参数 是一个方法名

3. 委托的 多调 "+=" , 相反操作 "-="

4. 委托 主要用于事件 还有回调函数中····

也可查看:http://www.tracefact.net/csharp-programming/delegates-and-events-in-csharp.aspx

  

参考:http://www.runoob.com/csharp/csharp-delegate.html

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. 委托(3).net 2.0中的委托

    由于.net 2.0引入了匿名方法,所以创建委托的方式可以更简化了. .net 2.0中的委托 有了匿名方法,上一篇的例子可以简化为: namespace DelegateDemo { //声明委托 ...

  4. 委托(4).net 3.5中的委托

    .net 3.5引入了Linq,lambda表达式,所以委托的创建变得更加简单和优雅了. .net 3.5中的委托 引入lambda表达式后,就不需要再使用匿名方法了,使得创建委托的方式更加简单和优雅 ...

  5. 深刻理解:C#中的委托、事件

    C#中的事件还真是有点绕啊,以前用JavaScript的我,理解起来还真是废了好大劲!刚开始还真有点想不明白为什么这么绕,想想和JS的区别,最后终于恍然大悟! C#中事件绕的根本原因: C#的方法,它 ...

  6. 转载->C#中的委托的使用和讲解

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

  7. 第二节:1_C#中的委托的使用和讲解(转)

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

  8. 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

    委托与Lambda表达式   1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树   一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...

  9. Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件

    一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...

随机推荐

  1. 查找 SQL SERVER 所有表记录数

    -- 所有表的记录数 SELECT a.name, b.rowsFROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.idWHERE ...

  2. mysql 主从日志文件mysql-bin文件清除方法

    默认情况下mysql会一直保留mysql-bin文件,这样到一定时候,磁盘可能会被撑满,这时候是否可以删除这些文件呢,是否可以安全删除,是个问题,不建议使用rm命令删除,这样有可能会不安全,正确的方法 ...

  3. Kafka与.net core(三)kafka操作

    1.Kafka相关知识 Broker:即Kafka的服务器,用户存储消息,Kafa集群中的一台或多台服务器统称为broker. Message消息:是通信的基本单位,每个 producer 可以向一个 ...

  4. .net core 2.0 mvc 初步学习

    mvc_study *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !impor ...

  5. Android Bug BaseExpandableListAdapter, getChildView

    @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastC ...

  6. javaweb从mysql中获取数据验证用户名密码成功跳转,失败重新验证

    要求:validate.jsp页面中获取请求参数(request.getparameter(“name属性的值”)),注意中文参数获取之前要设置请求编码(request.setCharaterEnco ...

  7. docker-ce的安装以及卸载

    注意:以下命令无特殊说明外均在root用户下执行 一.Docker CE的安装 1. 首先,卸载老旧的docker. yum remove docker \ docker-client \ docke ...

  8. Spring Boot启动过程(三)

    我已经很精简了,两篇(Spring Boot启动过程(一).pring Boot启动过程(二))依然没写完,接着来. refreshContext之后的方法是afterRefresh,这名字起的真.. ...

  9. angular核心原理解析2:注入器的创建和使用

    上一课没有讲到创建注入器的方法createInjector. 此方法,会创建两种不同的注入器:第一种叫做providerInjector,第二种叫做instanceInjector.providerI ...

  10. FlowPortal-BPM——移动手机端配置与IIS发布

    一.移动手机端配置 (1)VS打开文件夹iAnyWhere,配置config文件 (2)BPM-Web文件config中设置(设置为外网网址) 二.BPM设置 勾选移动审批可以设置要展示的字段信息,修 ...