一、委托初窥:一个拥有方法的对象

(1)本质:持有一个或多个方法的对象;委托和典型的对象不同,执行委托实际上是执行它所“持有”的方法。

  (2)如何使用委托?

    ①声明委托类型(delegate关键字)

    ②使用该委托类型声明一个委托变量

    ③为委托类型增加方法

    ④调用委托执行方法

(3)委托的恒定性:

  组合委托、为委托+=增加方法以及为委托-=移除方法让我们看起来像是委托被修改了,其实它们并没有被修改。事实上,委托是恒定的

  在为委托增加和移除方法时实际发生的是创建了一个新的委托,其调用列表是增加和移除后的方法结果。

delegate void PrintFunction();

class Test
{
public void Print1()//实例方法
{
Console.WriteLine( "Print1 -- instance" );
} public static void Print2()//静态方法
{
Console.WriteLine( "Print2 -- static" );
}
} class Program
{
static void Main()
{
Test t = new Test();
PrintFunction pf;
pf = t.Print1; pf += Test.Print2;
pf += t.Print1;
pf += Test.Print2; if ( pf != null )
{
pf();
}
else
{
Console.WriteLine( "Delegate is empty" );
}
}
}
补充:链式委托写法1
// 申明委托并绑定第一个方法
TestMulticastDelegate tmd = new TestMulticastDelegate(PrintMessage1);
// 绑定第二个方法
tmd += new TestMulticastDelegate(PrintMessage2);
// 绑定第三个方法
tmd += new TestMulticastDelegate(PrintMessage3);
// 调用委托
tmd(); 链式委托写法2
如上的例子
链式委托写法3
TestMulticastDelegate tmd1 = new TestMulticastDelegate(PrintMessage1);
TestMulticastDelegate tmd2 = new TestMulticastDelegate(PrintMessage2);
TestMulticastDelegate tmd3 = new TestMulticastDelegate(PrintMessage3);
// 核心本质:将三个委托串联起来
TestMulticastDelegate tmd = tmd1 + tmd2 + tmd3;
tmd.Invoke(); 在实际开发中经常使用第二种方法,但是却不能不了解方法三,它是链式委托的本质所在。
//http://www.cnblogs.com/edisonchou/p/4827578.html 链式委托的讲解

二、匿名方法

  在委托所持有的方法中,如果某个方法只被使用一次,这种情况下,除了创建委托语法的需要,没有必要创建独立的具名方法。匿名方法应运而生。

  匿名方法是在初始化委托时内联(inline)声明的方法。

using System;

class Program
{
delegate int OtherDel(int InParam); static void Main()
{
OtherDel del = delegate(int x)
{
return x + 20;
};
Console.WriteLine("{0}", del(5));
Console.WriteLine("{0}", del(6));
}
}

三、Lambda表达式:匿名方法的另一种形式,更易阅读

  (1)本质:简化语法的”语法糖“;

  (2)要点:

    ①Lambda表达式中的参数列表(参数数量、类型和位置)必须与委托相匹配;

    ②表达式中的参数列表不一定需要包含类型,除非委托有ref或out关键字(此时必须显示声明);

    ③如果没有参数,必须使用一组空的圆括号;

  (3)语法:

所有Lambda表达式都使用Lambda运算符=>,该运算符读作"goes to"。Lambda运算符的左边是输入参数(如果有),右边是表达式或语句块。

参考文章:

http://www.cnblogs.com/edisonchou/p/3704510.html

http://www.cnblogs.com/kingmoon/archive/2011/05/03/2035696.html

.NET基础拾遗(4)委托和事件1的更多相关文章

  1. C#基础篇 - 理解委托和事件

    1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...

  2. C# 篇基础知识5——委托和事件

    事件处理程序是基于“委托”机制运行的. 1.委托 (1)委托的定义和使用 有时需要将一个函数作为另一个函数的参数,这时就要用到委托(Delegate)机制.例如设计一个马戏表演函数: //定义委托 d ...

  3. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  4. 【.NET基础】--委托、事件、线程(3)

    之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A,进 ...

  5. 转载 【.NET基础】--委托、事件、线程(3)

      之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A ...

  6. 转载 【.NET基础】--委托、事件、线程(2) https://www.cnblogs.com/chengzish/p/4569912.html

    [.NET基础]--委托.事件.线程(2)   本文介绍event的使用以及原理,本文接上一篇文章的Demo继续[下载上一篇Demo] 上一篇我们在类(dg_SayHi.cs)里面定义代理了4个Del ...

  7. 转载 【.NET基础】--委托、事件、线程(1) https://www.cnblogs.com/chengzish/p/4559268.html

    [.NET基础]--委托.事件.线程(1)   1,委托 是存放方法的指针的清单,也就是装方法的容器 A, 新建winform项目[01委托],项目中添加dg_SayHi.cs 委托类 用于存储方法 ...

  8. .NET零基础入门05:委托与事件

    一:前言 本小节,我们需要停一停我们的小游戏开发,虽然它现在还不完美,还很简单,甚至还有BUG.但是,为了更好的理解C#,现在到了该深入了解一些基础知识的时候了. 当然,实际上,本小节内容对于零基础入 ...

  9. C#基础加强篇—委托、Lambda表达式和事件(下)

    3.事件 事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起.事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互引起的,也可能是由某些其他的 ...

  10. .NET C#基础(3):事件 - 不便处理的事就委托出去

    0. 文章目的   本文面向有一定.NET C#基础知识的学习者,介绍.NET中事件的相关概念.基本知识及其使用方法 1. 阅读基础   理解C#基本语法(方法的声明.方法的调用.类的定义) 2. 从 ...

随机推荐

  1. 关于Web安全的链接文章

    1.CSRF(跨站请求伪造) http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html 2.深入理解JavaScript Hijacki ...

  2. Swift 流程控制

    import Foundation ...{ == { print(index) } } // 可选变量 类型后面加? var myName:String?="jikexueyuan&quo ...

  3. ionic开发ios app

    注意必须是mac系统 1. 首先要安装node环境,Ionic的安装和后续的许多前端工具的安装都依赖于node的包管理器npm. nodeJs环境的安装很简单,去官网下载最新版的NodeJs直接安装即 ...

  4. poj3282

    定义一个有4x+1组成的无限集合x>0&x∈Z 素数   x 不能有x = y*z,y,z都是素数 合数 x 有x = y*z y|z中某个数是素数 simi数,只能由两个素数构成. 打 ...

  5. DOM 之Range(范围)

    -------<javascript高级程序设计>  12.4 范围  笔记------- DOM2级在Document类型中定义了createRange()方法,在兼容DOM的浏览器中, ...

  6. 转自:Tsihang 三层网络设备对于IP报文的分片和重组处理原理

    三层网络设备对于IP报文的分片和重组处理原理 对于网络分片,我一年前就想整理出来,虽然说网络上的资料很多,但是真正掌握精髓的除非真正做过分片程序,不然很难将协议栈整体联系起来理解.这篇文章,包括设计分 ...

  7. JQuery原理介绍及学习方法

    前言 对于JQuery,想必大家都很熟悉.目前,很多web项目,在实施的过程中,考虑到各浏览器原生JS API的兼容性,大都会选用JQuery或类似于JQuery这样的框架来进行网页效果开发.JQue ...

  8. 转载:Tomcat多数据源配置方法

    转载网址:http://blog.sina.com.cn/s/blog_53803b7b010144u5.html 关于在TOMCAT下配置多数据源,网上有很多方式,但是感觉也很混乱,俺只说俺们使用的 ...

  9. python类方法与对象方法学习

    class Test_Demo: TEST = 'test_value' def __init__(self,name,age): self.name = name self.age = age #s ...

  10. python修改txt文件内容

    ①以r模式打开文件并用readlines方法读入列表l中 ②修改相关行,直接用l[n]形式即可 ③关闭文件 ④以w方式打开文件,用writelines方法写入文件(覆盖文件内容) ⑤关闭文件 需要注意 ...