说起委托,有些刚刚入门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. NP完整性| 集1(简介)

    我们一直在写关于高效算法来解决复杂问题,如最短路径,欧拉图,最小生成树等.这些都是算法设计者的成功故事. 在这篇文章中,讨论了计算机科学的失败故事. 计算机可以解决所有的计算问题吗? 存在计算问题,即 ...

  2. JPA实体类注解、springboot测试类、lombok的使用

    前提准备: 搭建一个springboot项目,详情请参见其它博客:点击前往 1 引入相关依赖 web.mysql.jpa.lombok <?xml version="1.0" ...

  3. windows net 命令(转载)

    CMD-NET命令详解 net命令大全,net命令用法,net网络命令,net命令使用,net命令集,net命令介绍,net常用命令,net命令的使用技巧,net命令如何使用 大家在操作Windows ...

  4. 英雄联盟LOL用什么语言写的?

    是用openGL开发的 开发语言是c/c++ 客户端是一个.net的web界面

  5. shell 踩坑记

    变量赋值时,等号两边不能有空格: 在判断表达式中,不论是 [ -n "$1" ] 还是 [ -f  "$1" ] 都要在变量两侧加上双引号: 在使用与或非判断式 ...

  6. golang社区

    a development list for Go Programming Language https://groups.google.com/forum/#!forum/golang-dev a ...

  7. Android 内存暴减的秘密?!

    作者:杨超,腾讯移动客户端开发 工程师  商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 在我这样减少了26.5M Java内存! 一文中内存优化一期已经告一段落, ...

  8. sql查询化繁为简 告别rs.getString("XX"),bean属性赋值setXX("XX")

    一.在执行sql语句查询时候,查询的结果是set的map集合(ResultSet): 结果使用rs.getString("XX")获得对应属性的值,赋值到bean对象的相应的属性中 ...

  9. java中的位操作

    之前做项目的时候使用位操作不是很多,今天在刷leetcode上题目的时候用到了位操作,是leetcode中的第29题Divide Two Integers. 一.java的位操作: 位运算表达式由操作 ...

  10. Linux 文件路径包含特殊字符的处理方式

    文件路径包含特殊字符的处理方式 1)只用转义符 \ 2)使用双引号 mv /home/".Sent Items"/ /home/".&XfJT0ZABkK5O9g ...