说起委托,有些刚刚入门c#的人感觉很高大上,没有接触过,但是其实很多人都用过Lambda表达式,实际上Lambda表达式就是一个委托。

关于委托入门有个大神写的很详细:张子阳的博客  C#中的委托和事件 - Part.1 。下面就按照思明的理解介绍一下委托入门

1、委托是什么

  委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

1.2 委托分类:

  1.单播委托:绑定单个方法

  2.多播委托:绑定多个方法

2、为什么使用委托

  开发人员可以把方法的引用封装在委托对象中(把过程的调用转化为对象的调用,充分体现了委托加强了面向对象编程的思想),然后把委托对象传递给需要引用方法的代码,这样在编译的过程中我们并不知道调用了哪个方法,这样一来,C#引入委托机制后,使得方法声明和方法实现的分离,充分体现了面向对象的编程思想。

3、委托怎么用

3.1  委托的定义其实很简单:如下,首先新建一个控制台程序,然后进行如下操作,

(1)、新建了一个类用来 定义委托以及进行委托声明

          我们应该注意一点:委托的形参类型,形参个数和委托的返回值必须与将要绑定的方法的形参类型,形参个数和返回值一致;

public class GManage
{
/// <summary>
/// 1、定义委托,它定义了可以代表的方法的类型
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public delegate void GreetingDelegate(int x, int y); /// <summary>
/// 2、声明delegate1变量
/// </summary>
public GreetingDelegate delegate1; /// <summary>
/// 3、被调用委托的方法
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
public void SayHello(int x,int y)
{
if (delegate1 != null) //如果有方法注册委托变量
{
delegate1(x, y); //通过委托调用方法
}
}
}

  (2)、委托的方法绑定以及调用

在控制台程序 Program.cs中添加如下代码:

public class Program
{
public void Write1(int x, int y)
{
Console.WriteLine("{0}+{1}={2}", x, y, x + y);
} public static void Write2(int x, int y)
{
Console.WriteLine("{0}*{1}={2}", x, y, x * y);
} static void Main(string[] args)
{
GManage gm = new GManage();
gm.delegate1 = new Program().Write1; //先给委托类型的变量赋值
gm.delegate1 += Program.Write2; //给此委托变量再绑定一个静态方法
gm.SayHello(, ); // 将先后调用 Write1 与 Write2 方法
Console.ReadKey();
}
}

运行,输出结果如下:

3.2   如上操作我们进行了委托的操作,主要两步操作:声明委托和注册方法(也叫绑定方法)

  1.声明委托   用delegate声明;

2.绑定方法    绑定具体方法,传递方法名称;

3.3  如上操作我们知道了委托可以进行方法绑定,同样的委托也可以进行方法解绑:如下我们只修改 Program.cs中的main方法。

在原有的基础上添加解绑方法 -=

        static void Main(string[] args)
{
GManage gm = new GManage();
gm.delegate1 += new Program().Write1; //先给委托类型的变量赋值
gm.delegate1 += Program.Write2; //给此委托变量再绑定一个静态方法
gm.SayHello(, ); // 将先后调用 Write1 与 Write2 方法 Console.WriteLine("******解绑方法Write2后******");
gm.delegate1 -= Program.Write2; // 委托方法解绑
gm.SayHello(, ); // 解绑后只会调用 Write1
Console.ReadKey();
}

运行结果如下:委托仅仅执行了Write1。

3.4 什么是委托链

  换言之就是多播委托就可以产生委托链,以+= 和-=操作符分别进行绑定和解除绑定的操作,多个方法绑定到委托变量就形成了一个委托链。对其进行调用的时,将依次调用所有回调的方法。

4、总结

委托就是一个类,他的好处非常多,比如避免核心方法中存在大量的if....else....语句(或swich开关语句);满足程序设计的OCP原则;使程序具有扩展性;结合Lambda表达式,简化代码,高效编程;实现程序的松耦合(解耦),这个在事件(event)中体现比较明显等等。

委托扩展了我们的认知面,让我们进一步了解c#的博大精深。

码字不容易,转载请注明出处。谢谢

源码链接:https://github.com/YaoHigh/DelegateDemo

c#委托事件入门--第一讲:委托入门的更多相关文章

  1. MySQL----MySQL数据库入门----第一章 数据库入门

    第一章 数据库入门 1.1 数据库基础知识 1.1.1 数据库概述 数据不仅包括普通意义上的数字,还包括文字.图像.声音等.也就是说,凡是在计算机中用来描述事物的记录都可称作数据. 数据库的基本特点: ...

  2. java爬虫系列第一讲-爬虫入门

    1. 概述 java爬虫系列包含哪些内容? java爬虫框架webmgic入门 使用webmgic爬取 http://ady01.com 中的电影资源(动作电影列表页.电影下载地址等信息) 使用web ...

  3. Hibernate入门第一讲——Hibernate框架的快速入门

    Hibernate框架的概述 什么是框架? 框架指的是软件的半成品,已经完成了部分功能. JavaEE开发的三层架构 了解框架的基本概念之后,我们就来看看Hibernate框架处于JavaEE开发的经 ...

  4. NoSQL入门第一天——NoSQL入门与基本概述

    一.课程大纲 二.入门概述 1.为什么用NoSQL 单机MySQL的年代: 一个网站的访问量一般都不大,用单个数据库完全可以轻松应付. 我们来看看数据存储的瓶颈是什么? 1.数据量的总大小 一个机器放 ...

  5. c#委托事件入门--第二讲:事件入门

    上文 c#委托事件入门--第一讲:委托入门 中和大家介绍了委托,学习委托必不可少的就要说下事件.以下思明仍然从事件是什么.为什么用事件.怎么实现事件和总结介绍一下事件 1.事件是什么:. 1.1 NE ...

  6. Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)

    Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...

  7. c#之委托事件(DelegateEvent)

    前面一章学习了委托以及多播委托,接下来我们来学习下委托事件. 在学习委托事件的前提下,得知道什么是观察者模式. 首先,我们来模拟一个场景:例如,当一只狗汪汪汪叫的时候,baby被吓哭了,刚好要偷东西的 ...

  8. 关于ios使用jquery的on,委托事件失效

    $('.parents').on("click",'.child',function(){}); 类似上面这种,在ios上点击"child"元素不会起作用,解决 ...

  9. 委托事件(jQuery)

    <div class="content"> <ul> <li>1</li> <li>2</li> <l ...

随机推荐

  1. Docker了解

    Docker了解1.Docker能做什么:Docker能够解决虚拟机能够解决的问题,同时也能够解决虚拟机由于请求资源过高无法解决的问题. *隔离应用依赖 *创建应用镜像并进行复制 *创建容易分发的即启 ...

  2. 在表格中,th scope="row"和th scope="col"中的scope属性的用法及意义

    把表头和数据联系起来:scope,id,headers属性就我用到现在,很多表格要比上面提供的例子复杂的多.让例子复杂一点,我会移去"Company"表头,并且把第一列的数据移到表 ...

  3. 总结oninput、onchange与onpropertychange事件的用法和区别

    前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框hu9i动态显示还可以输入的字数.过去一般都使用onchange/onkeyup/onkeypress/onke ...

  4. 跟我一起,利用bitcms内容管理系统从0到1学习小程序开发:一、IIS下SSL环境搭建

    缘起 1.从事互联网十来年了,一直想把自己的从事开发过程遇到的问题给写出来,分享给大家.可是可是这只是个种想法,想想之后就放下了,写出来的类文章是少之又少.古人说无志之人常立志,有志之人立长志.今天, ...

  5. 对DataTable(或者DataSet)修改后,提交修改到数据库

    http://blog.csdn.net/nidexuanzhe/article/details/8228832 说明:通常我们在做数据库交互时,并不一定要使用特定的SQL语句来更新数据,.NET F ...

  6. ASP.NET Core学习之二 菜鸟踩坑

    对于像我这样没接触过core的人,坑还是比较多的,一些基础配置和以前差别很大,这里做下记录 一.Startup 1.注册服务 // This method gets called by the run ...

  7. Mock拦截请求URL返回模板数据

    背景 : 前后端开发依赖后端数据, 当前端页面开发完成 ,后端在没有提供前端数据的情况下 ,前端无法测试, 导致开发效率低 ,速度慢 ,为了解决这一问题 ,通过Mock模拟生成数据在不改变原有代码前提 ...

  8. TPYBoard v102 驱动28BYJ-48步进电机

    TPYBoard v102 驱动28BYJ-48步进电机 实验目的 了解步进电机的工作原理 学习步进电机的驱动方法 实验器材 TPYBoard v102 1块 微型步进电机(28BYJ-48) 1个 ...

  9. JS 实现图片的预加载(转载)

    图片预加载是web开发中一种应用相当广泛的技术,比如我们在做图片翻转显示等特效的时候,为了让图片在转换的时候不出现等待,我们最好是先让图片下载到本地,然后在继续执行后续的操作. 下面的函数实现了一个我 ...

  10. js 类数组arguments详解

    arguments并不是一个真正的数组,而是一个"类似数组(array-like)"的对象: 就像下面的这段输出,就是典型的类数组对象: [, , callee: ƒ, Symbo ...