【C#】C#委托使用详解(Delegates)

摘要

委托是C#编程一个非常重要的概念,也是一个难点。本文将系统详细讲解委托。

1. 委托是什么?

其实,我一直思考如何讲解委托,才能把委托说得更透彻。说实话,每个人都委托都有不同的见解,因为看问题的角度不同。个人认为,可以从以下2点来理解:

 (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型

(2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象。

既然委托是一种类型,那么它存储的是什么数据?

我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。

2. 委托类型的定义

委托是类型,就好像类是类型一样。与类一样,委托类型必须在被用来创建变量以及类型对象之前声明。

delegate void MyDel(int x);

委托类型声明:

(1) 以deleagate关键字开头。

(2)返回类型+委托类型名+参数列表。

3. 声明委托变量

MyDel del1,del2;

4. 初始化委托变量

(1) 使用new运算符

new运算符的操作数的组成如下:

  • 委托类型名
  • 一组圆括号,其中包含作为调用列表中的第一个成员的方法的名字。方法可以是实例方法或静态方法。
del1 = new MyDel( myInstObj.MyM1 );
del2 = new MyDel( SClass.OtherM2 );

(2)使用快捷语法

快键语法,它仅由方法说明符构成。之所以能这样,是因为在方法名称和其相应的委托类型之间有隐式转换。

del1 = myInstObj.MyM1;
del2 = SClass.OtherM2;

5. 赋值委托

由于委托是引用类型,我们可以通过给它赋值来改变包含在委托变量中的方法地址引用。旧的引用会被垃圾回收器回收。

MyDel del;
del = myInstaObj.MyM1; //委托初始化
del = SClass.OtherM2;//委托重新赋值,旧的引用将被回收

6. 组合委托

委托可以使用额外的运算符来组合。这个运算最终会创建一个新的委托,其调用列表是两个操作数的委托调用列表的副本的连接。

委托是恒定的,操作数委托创建后不会被改变。委托组合拷贝的是操作数的副本

MyDel del1 = myObj.MyMethod;
MyDel del2 = SClass.OtherM2;
MyDel del3 = del1 + del2;   //组合调用列表

7. 委托加减运算

可以使用+=运算符,为委托新增方法。

同样可以使用-=运算符,为委托移除方法。

MyDel del = myObj.MyMethod;
del += SClass.OtherM2; // 增加方法
del -= myObj.MyMethod; // 移除方法

8. 委托调用

委托调用跟方法调用类似。委托调用后,调用列表的每个方法将会被执行。

在调用委托前,应判断委托是否为空。调用空委托会抛出异常。

if(null != del)
{
     del();//委托调用
}

9. 匿名方法

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

基本结构:

deleage( 参数 ) { 语句块 }

例如:


delegate int MyDel (int x); //定义一个委托 

MyDel del = delegate( int x){ return x; };

从上面我们可以看到,匿名方法是不会显示声明返回值的

10. Lambda表达式

Lambda表达式主要用来简化匿名方法的语法。在匿名方法中,delegate关键字有点多余,因为编译器已经知道我们将方法赋值给委托。通过几个简单步骤,我们就可以将匿名方法转换为Lambda表达式:

  • 删除delegate关键字
  • 在参数列表和匿名方法主体之间防Lambda运算符=>。Lambda运算符读作"goes to"。
MyDel del = delegate( int x) { return x; };//匿名方法
MyDel del2 = (int x) => {return x;};//Lambda表达式
MyDel del3 = x => {return x};//简写的Lambda表达式
时间: 2024-10-29 19:08:14

【C#】C#委托使用详解(Delegates)的相关文章

C#委托使用详解(Delegates)

摘要 委托是C#编程一个非常重要的概念,也是一个难点.本文将系统详细讲解委托. 1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻.说实话,每个人都委托都有不同的见解,因为看问题的角度不同.个人认为,可以从以下2点来理解:  (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型. (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象. 既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址.

委托基础详解

/*委托是一个类型安全的对象        * 它指向程序中另一个以后被调用的方法或多个方法.委托类型包含3个重要的信息:        * 1:它所调用的方法的名称        * 2:该方法的参数(可选)        * 3:该方法的返回值(可选)        * 注:.net委托既可以指向静态方法,也可以指向实例方法        *         * 当一个委托对象被创建并提供了上述信息后,它可以在运行时动态调用其他指向的方法,可以看到 .Net Framework 中每个委托(

javascript事件委托机制详解

以个人前端工作面试经历来看,javascript事件委托是问的最多的一类题目之一,熟悉事件委托能够了解你对于javascript的掌握程度. 面试官可能问一下问题,现在有5个li待办事件,需要实现当点击一个li时实现弹出该li的信息 <ul class="top"> <li>橘子</li> <li>香蕉</li> <li>苹果</li> <li>梨子</li> <li>

[转]委托的详解

C# 中的委托和事件 委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里堵得慌,浑身不自在.本章中,我将由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..NET Framework 中的委托和事件.委托中方法异常和超时的处理.委托与异步编程.委托和事件对Observer 设计模式的意义,对它们的编译代码也做了讨论

C#中常见的系统内置委托用法详解(抄录)

C#中常见的系统内置委托 Action类.Func类.Predicate<T>.Comparison<T>委托 Action类的委托 Action委托 封装一个方法,该方法不具有参数并且不返回值 Action<T>委托 封装一个方法,该方法只有一个参数并且不返回值 Action<T1,T2>委托 封装一个方法,该方法具有两个参数并且不返回值 static void Main(string[] args) { #region Action<T>委托

Action&lt;T&gt; 委托使用详解

Action<T> 委托其实与[button url="http://redcat7.net/?p=343" style="dark"]Func<T, TResult> 委托[/button]一样,都是为了简化委托的使用,这两者的不同之处在于Action<T> 封装一个方法且该方法只有一个参数并且不返回值,而Func<T, TResult>封装一个具有一个参数并返回 TResult 参数指定的类型值的方法. 使用 Ac

UITableView SDK委托方法详解

今天跟大家分享一下UITableView的各个代理方法的用法,主要是根据SDK里面的介绍,再加上自己的分析与测试,总结成此文.如果有疑问的话,希望大家留言告诉我~ 本文主要讲解对于UITableView最重要的两个协议 UITableViewDataSource UITableViewDelegate UITableViewDataSource 1)tableView:cellForRowAtIndexPath: 申请一个cell插入到表视图特定的位置,cell生成访问到的方法. 2)numbe

JS中的事件委托/代理详解

概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.那这是什么意思呢?网上的各位大牛们讲事件委托基本上都用了同一个例子,就是取快递来解释这个现象,我仔细揣摩了一下,这个例子还真是恰当,我就不去想别的例子来解释了,借花献佛,我摘过来,大家认真领会一下事件委托到底是一个什么原理: 有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托给前台MM

泛型委托事件详解示例

使用委托时要先实例化,和类一样,使用new关键字产生委托的新实例,然后将一个或者多个与委托签名匹配的方法与委托实例关联.随后调用委托时,就会调用所有与委托实例关联的方法. 与委托关联可以是任何类或者结构中的方法,可以是静态方法,只要是可以访问的方法都可以.创建一个委托类型使用关键字delegate(委托) 一个委托实例,关联三个方法 移除一个委托实例中的方法  使用“-” 将方法作为参数传递 委托可以让方法作为参数传递给其它方法. 事件自身就是委托类型,由于委托可以绑定和调用多个方法,所以会为事