C#委托简介

C#中委托是一种引用类型,该引用类型与其他引用类型不同,在委托对象的引用中存放的不是对数据的引用而是存放对方法的引用,即委托的内部包含一个指向某个方法的指针。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传递给调用引用方法的代码。

声明格式如下:

【修饰符】delegate 【返回类型】 【委托名称】(【参数列表】)

与委托类型相匹配的方法必须满足以下两个条件:

1、 具有相同的签名,即具有相同的参数数目,并且类型相同,顺序相同,参数的修饰符也相同

2、 具有相同的返回类型

委托是安全的,它与其他所有的C#成员一样是一种数据类型,并且任何委托对象都是System.Delegate的某个派生类的一个对象。结构图如下:

如何使用委托?

1、定义委托类型

[访问修饰符]delegate 返回类型 委托名(形参);

2、声明委托对象

委托名 委托实例名;

3、创建委托对象(确定与哪些方法进行绑定)

委托实例名=new 委托名(某个类的方法)

4、使用委托调用方法

委托实例名(实参)

委托注意事项:

1、委托和方法必须具有相同的参数。

2、委托可以调用多个方法,即一个委托对象可以维护一个可调用方法的列表而不是单独的一个方法,称为多路广播(多播)。

3、使用+=和-=运算实现方法的增加和减少

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Delegate;
 6
 7 namespace Delegate
 8 {
 9
10         public delegate int Call(int num1, int num2);//第一步:定义委托类型
11         class SimpleMath
12         {
13             // 乘法方法
14             public int Multiply(int num1, int num2)
15             {
16                 return num1 * num2;
17             }
18
19             // 除法方法
20             public int Divide(int num1, int num2)
21             {
22                 return num1 / num2;
23             }
24         }
25     }
26     class Test
27     {
28         static void Main(string[] args)
29         {
30             Call objCall;//第二步:声明委托对象
31             // Math 类的对象
32             SimpleMath objMath = new SimpleMath();
33             // 第三步:创建委托对象,将方法与委托关联起来
34             objCall = new Call(objMath.Multiply);
35
36             Call objCall1 = new Call(objMath.Divide);
37             objCall += objCall1;//向委托增加一个方法
38             //objCall -= objCall1;//向委托减去一个方法
39             // 调用委托实例,先执行objMath.Multiply,然后执行objMath.Divide
40             int result = objCall(5, 3);
41             System.Console.WriteLine("结果为 {0}", result);
42             Console.ReadKey();
43         }
44     }

写法:

1、委托 委托名=new 委托(会调用的方法名); 委托名(参数);

2、委托 委托名 =会调用的方法名; 委托名(参数);

3、匿名方法

委托 委托名=delegate(参数){会调用的方法体};委托名(参数);

4、拉姆达表达式

委托 委托名=((参数1,。。参数n)=>{会调用的方法体});委托名(参数);

5、用Action<T>和Func<T>,第一个无返回值

Func<参数1, 参数2, 返回值> 委托名= ((参数1,参数2) => {带返回值的方法体 });返回值=委托名(参数1,参数2);

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using @delegate;
 6
 7 namespace @delegate
 8 {
 9         public delegate int Call(int num1, int num2);
10         class SimpleMath
11         {
12             // 乘法方法
13             public static int Multiply(int num1, int num2)
14             {
15                 return num1 * num2;
16             }
17
18             // 除法方法
19             public int Divide(int num1, int num2)
20             {
21                 return num1 / num2;
22             }
23         }
24     class Test
25     {
26         static void Main(string[] args)
27         {
28             //--------------------第一种写法------------------------//
29             //Call objCall = new Call(SimpleMath.Multiply);
30             //Call objCall1 = new Call(new SimpleMath().Divide);
31             //--------------------第二种写法------------------------//
32             //Call objCall = SimpleMath.Multiply;
33             //Call objCall1 = new SimpleMath().Divide;
34             //--------------------第三种写法------------------------//
35             //Call objCall = delegate(int a, int b)
36             //{
37             //    return a * b;
38             //};
39             //Call objCall1 = delegate(int a, int b)
40             //{
41             //    return a / b;
42             //};
43             //--------------------第四种写法------------------------//
44             //Call objCall =((int a,int b)=> { return a*b;});
45             //Call objCall1 = ((int a, int b) => { return a / b; });
46             //--------------------第五种写法------------------------//
47             Func<int, int, int> objCall = ((a, b) => { return a * b; });
48             Func<int, int, int> objCall1 = ((a, b) => { return a / b; });
49              Action<int, int> ob = ((a, b) => { Console.WriteLine(a * b); });
50              ob(5, 3);
51             //----------------------------------------------------//
52              int result = objCall(5, 3);
53              int result1 = objCall1(5, 3);
54              System.Console.WriteLine("结果1为 {0},结果2为{1}", result,result1);
55             Console.ReadKey();
56         }
57     }
58 }

注:部分内容转自http://www.cnblogs.com/Blackieboy/articles/2203346.html

时间: 2024-12-12 08:32:03

C#委托简介的相关文章

QT开发(三十八)——Model/View框架编程

QT开发(三十八)--Model/View框架编程 一.自定义模型 1.自定义只读模型 QAbstractItemModel为自定义模型提供了一个足够灵活的接口,能够支持数据源的层次结构,能够对数据进行增删改操作,还能够支持拖放.QT提供了 QAbstarctListModel和QAbstractTableModel两个类来简化非层次数据模型的开发,适合于结合列表和表格使用. 自定义模型需要考虑模型管理的的数据结构适合的视图的显示方式.如果模型的数据仅仅用于列表或表格的显示,那么可以使用QAbs

前端面试的面试经验

?? 文章列表 前端面试总结--基础javascript篇 前端面试总结--进阶javascript篇 前端面试总结--http.html和浏览器篇 前端面试总结--css篇 一.基础javascript篇 1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的. 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少.对get请求参数的限制是来源与浏览器或web服务器,浏览器或web服务器限制了url的长度.为了明确这个概

前端面试:基础javascript篇(一)

(1)get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的. 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少.对get请求参数的限制是来源与浏览器或web服务器,浏览器或web服务器限制了url的长度.为了明确这个概念,我们必须再次强调下面几点: HTTP 协议未规定 GET 和POST的长度限制 GET的最大长度显示是因为浏览器和 web服务器限制了 URI的长度 不同的浏览器和WEB服务器,限制的最大长度不一样 要支

C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介

委托和事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 一.为什么要使用委托 委托的应用之一:将一个方法作

JS事件委托机制简介

目的--为了减少对DOM的操作,使用事件委托. 理解--举例说明:有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托给前台MM代为签收.现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递).前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款.这种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收. 原理--事件委托是利用事件的冒泡原理来实现的

C#中委托和事件

目 录 1.1 理解委托 2 1.1.1 将方法作为方法的参数 2 1.1.2 将方法绑定到委托 4 1.2 事件的由来 6 1.2.1 更好的封装性 6 1.2.2 限制类型能力 9 1.3 委托的编译代码 10 1.4 .NET 框架中的委托和事件 11 1.4.1 范例说明 11 1.4.2 Observer 设计模式简介 12 1.4.3 实现范例的Observer 设计模式 13 1.4.4 .NET 框架中的委托与事件 14 1.5 委托进阶 16 1.5.1 为什么委托定义的返回值

shiro学习笔记_0100_shiro简介

前言:第一次知道shiro是2016年夏天,做项目时候我要写springmvc的拦截器,申哥看到后,说这个不安全,就给我捣鼓了shiro,我就看了下,从此认识了shiro.此笔记是根据网上的视频教程记录的,shiro的文档感觉不是很好,所以结合老师的讲课和文档,感觉条理更清晰些.以便日后查阅 shiro:Shiro是一个基于java的开源的安全管理框架. Shiro可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等可用于javase和javaee,还可用于分布式集群环境. 在ja

ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware.CustomizeMiddleware和Asp.NetCore Identity.但是由于所有的ASP.NET Core的版本有些老,所以,此次重写一次.使用最新的ASP.NET Core 1.1版本.对于ASP.NET Core 1.1 Preview 1会在以后的文章中介绍 目录 使用静态文件 使用路由

事件与委托

C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量).例如:委托类型 委托实例 = new 委托类型(方法名); 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易