理解委托(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); };

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

理解委托(delegate)及为什么要使用委托的更多相关文章

  1. C# -- 等待异步操作执行完成的方式 C# -- 使用委托 delegate 执行异步操作 JavaScript -- 原型:prototype的使用 DBHelper类连接数据库 MVC View中获取action、controller、area名称、参数

    C# -- 等待异步操作执行完成的方式 C# -- 等待异步操作执行完成的方式 1. 等待异步操作的完成,代码实现: class Program { static void Main(string[] ...

  2. 深入理解委托(Delegate)

    前言 委托其实一直以来都感觉自己应该挺熟悉的,直到最近又去翻了翻 CLR via C#,感觉我之前的理解可能还有失偏颇.在这记录一下. 之前文章的链接: 接口和委托的泛型可变性 C#高级编程笔记 De ...

  3. [.NET] C# 知识回顾 - 委托 delegate (续)

    C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...

  4. C# 委托Delegate(一) 基础介绍&用法

    本文是根据书本&网络 前人总结的. 1. 前言 定义&介绍: 委托Delegate是一个类,定义了方法的类型, 使得可以将方法当做另一个方法的参数来进行传递,这种将方法动态地赋给参数的 ...

  5. C#基础知识六之委托(delegate、Action、Func、predicate)

    1. 什么是委托 官方解释 委托是定义方法签名的类型,当实例化委托时,您可以将其实例化与任何具有兼容签名的方法想关联,可以通过委托实例调用方法. 个人理解 委托通俗一点说就是把一件事情交给别人来帮助完 ...

  6. CLR via C#(12)-委托Delegate

    本来按照进度应该学习事件了,可总觉得应该委托在前,事件在后,才好理解. 委托是一个类,它提供了回调函数机制,而且是类型安全的.使用委托可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数 ...

  7. 委托Delegate,多播委托和委托链

    定义一个委托 public delegate void CalculateDelegate(int 32 x,int 32 y); 定义一个委托类型的变量 public static Calculat ...

  8. 【温故知新】C#委托delegate

    在c#的学习过程中,学到委托与事件总会迷糊一段时间,迷糊过后自然而就似懂非懂了~,所以最近我打算把以前所学的迷糊过的知识总结,温故知新,总结记录下来. 首先,我们来看一下msdn对委托的定义: del ...

  9. c# 委托 delegate

    委托是一种存储函数引用的类型,在事件和事件的处理时有重要的用途 通俗的说,委托是一个可以引用方法的类型,当创建一个委托,也就创建一个引用方法的变量,进而就可以调用那个方法,即委托可以调用它所指的方法. ...

随机推荐

  1. 在android里用ExpandableListView实现二层和三层列表

    转载自http://www.cnblogs.com/nuliniaoboke/archive/2012/11/13/2767957.html 二层列表是直接用androidAPI中的Expandabl ...

  2. [转]Ubuntu10下MySQL搭建Amoeba系列(文章索引)

    一.前言(Introduction) 使用了Amoeba有一段时间了,发现官方博客:Amoeba使用指南有很多地方都是错误的,在我实战中给到一些错误的指示,所以我想写些在搭建的实战中给大家一点指引.欢 ...

  3. 【转载】访问WEB-INF目录中的JSP文件

    转自:http://blog.csdn.net/eidolon8/article/details/7050114 方法1:本来WEB-INF中的jsp就是无法通过地址栏访问的.所以安全.如果说你要访问 ...

  4. Unity中使用协程进行服务端数据验证手段

    近期在做项目中的个人中心的一些事情,用户头像上传,下载,本地缓存,二级缓存,压缩,这些都要做,麻雀虽小五脏俱全啊,也是写的浑浑噩噩的, 当我们在上传用户头像的时候,向服务端发送上传头像请求之前,一般都 ...

  5. PWA - 渐进式网络应用初认识

    Progressive Web Apps 简称PWA,是一种接近原生用户体验的渐进增强的web-app.从浏览器演进而来,沉浸式的体验,改进web的性能低下等.是Google 在2015年提出,今年才 ...

  6. Android 6.0 M userdebug版本执行adb remount失败

    [FAQ18076]Android 6.0 M版本默认会打开system verified boot,即在userdebug和user版本会把system映射到dm-0设备,然后再挂载.挂载前会检查s ...

  7. Maven之(五)Maven仓库

    本地仓库 Maven一个很突出的功能就是jar包管理,一旦工程需要依赖哪些jar包,只需要在Maven的pom.xml配置一下,该jar包就会自动引入工程目录.初次听来会觉得很神奇,下面我们来探究一下 ...

  8. shell 文件中列的整合成一个文件

    原文件 第一种方法 [root@wxb- jt]# paste -d "," b c d ,q, , ,e, ,r, ,t, [root@wxb- jt]# paste b c d ...

  9. equals和hashcode为什么要一起重写

    equals()方法与hashCode()的通用协定是:2.1 如果两个对象相等(equal),那么必须拥有相同的哈希码(hash code)2.2 即使两个对象有相同的哈希值(hash code), ...

  10. iOS 消息推送证书生成方法的简单说明

    openssl x509 -in idp.flowtreasure.cer -inform der -out PushChatCert.pem openssl pkcs12 -nocerts -out ...