理解委托(delegate)及为什么要使用委托

委托:是一种定义方法签名的类型。 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。

上述为官方说法,理解起来比较难,举个生活中的例子:

某人有三子,让他们各自带一样东西出门,并带回一头猎物。
上面一句话可以理解为父亲对儿子的委托:猎物 办法(工具 某工具)-->delegate 猎物(返回值) 带回猎物(委托名)(工具(参数类型) x)-->delegate int GetValue(int i)
三个人执行委托的方法各不相同
兔子 打猎(工具 弓)-public static int GetValue1(int i){ return i; }
野鸡 买(工具 钱)-public static int GetValue2(int i){ return i*2; }
狼 诱捕(工具 陷阱)-public static int GetValue3(int i){ return i*i; }

如何调用委托

用new关键字(将方法名作为参数)生成一个委托对象,建立委托与方法的关联。

GetValue obj = new GetVlaue(Class.GetValue1);

obj(3); --> result: 3

GetValue obj = new GetVlaue(Class.GetValue2);

obj(3); --> result: 6

GetValue obj = new GetVlaue(Class.GetValue3)

obj(3); --> result: 9

通过委托调用不同的方法,将需要执行的方法作为委托的参数

我们还可以实现多路广播委托,什么是多路广播委托,看例子:

GetValue obj = new GetVlaue(Class.GetValue1);

obj += new GetVlaue(Class.GetValue2);

obj += new GetVlaue(Class.GetValue3);

obj(3);

多路广播委托即:一处调用委托,所有关联方法都会被调用。

委托的好处

1.相当于用方法作为另一方法参数(类似于C的函数指针)
2.在两个不能直接调用的方法中作为桥梁,如:在多线程中的跨线程的方法调用就得用委托
3.当不知道方法具体实现什么时使用委托,如:事件中使用委托

附:.net framework中对委托进行了封装,直接使用Func<>来代替delegate,Func<>最多有四个参数的重载。

NEW:

我把委托理解为:委托是一种方法的格式,当然他也是一种类型。

只要是方法的格式跟委托定义的格式是一样的,那么就可以把该方法附加给该委托。看以下demo

声明委托:

public delegate void Add(int a,int b );

声明一个格式相同的方法:

static void OtherMethod(int a ,int b)
{Console.WriteLine(a+b);}

给类声明一个委托类型的成员变量

public class Person    
{
public string Name { set; get; }
public string Age { set; get; }
public Add MyAdd ;
}

将方法附加给委托,调用,测试如下:

static voidMain(string[] args)
{
Person p1 =new Person ();
p1.MyAdd = OtherMethod;
p1.MyAdd(7, 8);
Console.ReadLine();
}

控制台输出—— 15

如果我们定义的OtherMethod不常用,就没有必要单独声明一个方法。可以用匿名方法,即:在给委托附加方法的时候,直接构造一个跟委托格式相同的匿名方法就可以了:

写法如下:

p1.MyAdd = delegate(inta, int b) { Console.WriteLine(a + b); };

 

匿名方法,顾名思义,没有方法名,只有方法参数和方法的算法,可真是够简单了。

同样我们也可以直接用lamuda表达式,直接构造一个方法,如下:

 p1.MyAdd = (int a, int b) => {Console.WriteLine(a + b); };

匿名方法和拉姆达表达式的出现,使得写方法变得更加简便了。

最新文章

  1. Html to Pdf 的另类解决方案
  2. sql server 2000,Log.LDF文件丢失,附加数据库失败的解决办法[转]
  3. 在新机器部署Qt+mysql程序
  4. Linux下如何查看系统启动时间和运行时间
  5. SpringMVC 通过post接收form参数或者json参数
  6. 安卓手机修改host
  7. OData services入门----使用ASP.NET Web API描述
  8. BZOJ 2743 采花(树状数组)
  9. Java学习笔记——双等号和equals的区别
  10. 2014-9-17二班----10 web project
  11. keil多文件组织方法
  12. nagios 实现Mysql 主从同步状态的监控
  13. http协议的各个版本及区别
  14. Android 手势&amp;amp;触摸事件 MotionEvent
  15. RAC OCR盘故障导致的集群重启恢复
  16. 201521123050《Java程序设计》第1周学习总结
  17. JavaScript 重点笔记
  18. 业务开发(一)—— MySQL
  19. C++如何禁止对象的复制操作
  20. adb command not found / abd&#39; 不是内部或外部命令,也不是可运行的程序 或批处理文件。最简易修改

热门文章

  1. spring请求到达controller但响应404
  2. eclipse安装svn插件的多种方式
  3. eclipse中svn插件的安装和tortoiseSVN的安装
  4. centos7 install rvm
  5. 形象化理解nice值越高优先级越低
  6. SVN版本控制的使用
  7. c#的as关键字
  8. MyBatis 学习-动态 SQL 篇
  9. java中的d单例模式
  10. HDU 1013 Digital Roots(字符串)