.NET基础拾遗(4)委托和事件1
一、委托初窥:一个拥有方法的对象
(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的更多相关文章
- C#基础篇 - 理解委托和事件
1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...
- C# 篇基础知识5——委托和事件
事件处理程序是基于“委托”机制运行的. 1.委托 (1)委托的定义和使用 有时需要将一个函数作为另一个函数的参数,这时就要用到委托(Delegate)机制.例如设计一个马戏表演函数: //定义委托 d ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- 【.NET基础】--委托、事件、线程(3)
之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A,进 ...
- 转载 【.NET基础】--委托、事件、线程(3)
之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A ...
- 转载 【.NET基础】--委托、事件、线程(2) https://www.cnblogs.com/chengzish/p/4569912.html
[.NET基础]--委托.事件.线程(2) 本文介绍event的使用以及原理,本文接上一篇文章的Demo继续[下载上一篇Demo] 上一篇我们在类(dg_SayHi.cs)里面定义代理了4个Del ...
- 转载 【.NET基础】--委托、事件、线程(1) https://www.cnblogs.com/chengzish/p/4559268.html
[.NET基础]--委托.事件.线程(1) 1,委托 是存放方法的指针的清单,也就是装方法的容器 A, 新建winform项目[01委托],项目中添加dg_SayHi.cs 委托类 用于存储方法 ...
- .NET零基础入门05:委托与事件
一:前言 本小节,我们需要停一停我们的小游戏开发,虽然它现在还不完美,还很简单,甚至还有BUG.但是,为了更好的理解C#,现在到了该深入了解一些基础知识的时候了. 当然,实际上,本小节内容对于零基础入 ...
- C#基础加强篇—委托、Lambda表达式和事件(下)
3.事件 事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起.事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互引起的,也可能是由某些其他的 ...
- .NET C#基础(3):事件 - 不便处理的事就委托出去
0. 文章目的 本文面向有一定.NET C#基础知识的学习者,介绍.NET中事件的相关概念.基本知识及其使用方法 1. 阅读基础 理解C#基本语法(方法的声明.方法的调用.类的定义) 2. 从 ...
随机推荐
- 【nodejs学习】0.nodejs学习第一天
1.模块 大一点的程序都需要模块化,nodejs也不例外,代码放到不同的文件中,每一个文件就可以是一个模块,文件路径名就是一个模块名.每个模块中包含三个预先定义的变量: 1.require:用于在当前 ...
- C#高级知识点概要(2) - 线程并发锁
本文目录: 线程的简单使用 并发和异步的区别 并发控制 - 锁 线程的信号机制 线程池中的线程 案例:支持并发的异步日志组件 线程的简单使用 常见的并发和异步大多是基于线程来实现的,所以本文先讲线程的 ...
- unity中数据的持久化存储
unity 提供了PlayerPrefs这个类用于存储游戏数据到电脑硬盘中. 这个类有10个函数可以使用 Class Functions类函数 SetInt Sets the value of the ...
- 一个简单C程序的汇编代码分析
几个重要的寄存器 eip - 用于存放当前所执行的指令地址 esp - 栈(顶)指针寄存器 ebp - 基址(栈底)指针寄存器 简单的C程序 int g(int x) { ; } int f(int ...
- JQuery控制input的readonly和disabled属性
jquery设置元素的readonly和disabled Jquery的api中提供了对元素应用disabled和readonly属性的方法,在这里记录下.如下: 1.readonly $('in ...
- js控制TR的显示影藏
在很多现实的场景中,有的文本框我们希望在选择“是”的按钮之后才出现,这就需要js控制TR的隐藏和显示,(div的影藏显示类似) 以下是一段选择是的按钮就显示身高和体重的文本框的代码.注意:ready方 ...
- jquery-multiselect在ie6里的一个bug
在使用jquery-multiselect(一个把下拉框改造成带checkbox的可以多选的控件)时,正常时应该是下面这样:而它在ie6里是下面这样: 其中第一个bug参考‘ie6里png图片不透明’ ...
- 16--Box2D使用(二、显示物理世界)
在上一篇文章中我们创建了的一个物理世界,当物理世界中的刚体一个也没有显示出来.为显示物理世界中的物体,我们需要引入GLES-Render(调试Box2D使用).这两个文件可以再 %Cocos_Home ...
- About abstract class.
Abstract means should be realized. Virtual means could be overrided. It is very different!
- C程序设计语言练习题1-10
练习1-10 编写一个将输入复制到输出的程序,并将起重的制表符替换为\t,把回退符替换成\b,把反斜杠替换为\\.这样可以将制表符和回退符以可见的方式显示出来. 代码如下: #include < ...