我想,读者们可能看过一部电影叫《全民目击》,在电影中,富豪林泰婚期将至,准新娘却惨死地下停车场,林泰的富二代女儿林萌萌成为最大嫌疑人,林泰不惜重金聘请国内顶级律师周莉为女儿辩护,而公诉方却是十多年一直追查林泰的童涛。随着法庭质证的深入,罪案真相却越来越扑朔迷离。所有人都深陷迷局,真相隐遁在迷雾之中。一如电影的主题,“人的一生,总有些东西比命还重要。”心灵的救赎,更发人深省。在电影中,林泰需要打官司,聘请国内顶级律师周莉为女儿萌萌辩护,然而律师真正执行的是当事人的陈词,这时候律师就是一个委托对象,当事人委托律师这个对象去帮助自己辩护,这就是我们电影中委托的例子,然而c#中委托的概念也就好比周莉律师这个对象,从中可以得出委托是一个类,因为只有类才有对象的概念,从而也体现了c#是面向对象的语言。

在我们的程序世界中,委托也如电影这般简单么?当然,什么是OO,OO就是现实世界的抽象,所有现实世界的事物,在OO里都能得到很好的诠释,在我们的现实世界中,委托相当于一个命令,做事情的是别人,而在程序的世界里委托知识存储了各个方法的地址,而她自己什么都不做,接下来,我们举一个简单的例子,时至母亲节,姐姐委托妹妹去买康乃馨送给妈妈,怎么在程序的世界中体现呢?

//妹妹类
    public class Meimie
    {
        //其实买康乃馨,辛苦的是妹妹
        public static void BuyCarnation()
        {
            Console.WriteLine("老姐啊,一起买,才有心意!");
        }
    }

    //姐姐类
    class Jiejie
    {
        //声明一个委托,其实就是个“命令”
        public delegate void BuyCarnation();

        public static void Main(string[] args)
        {
            //这里就是具体阐述这个命令是干什么的,本例是meimei.BuyCarnation“妹妹买康乃馨”
            BuyCarnationEventHandler myDelegate = new BuyCarnationEventHandler(meimei.BuyCarnation);

            //这时候委托被附上了具体的方法
            myDelegate();
            Console.ReadKey();
        }
    } 

其中,

 BuyCarnationEventHandler myDelegate = new BuyCarnationEventHandler(meimei.BuyCarnation);

是委托的声明方法,BugCarnationEventHandler(委托的方法),委托的方法必须要加上,因为委托的构造函数是不为空的,注意,委托的参数和返回类型,都要和我们要具体委托的方法一致,如

 public delegate void BuyCarnationEventHandler();

  public static void BuyCarnation()
  {
   Console.WriteLine("老姐啊,一起买,才有心意!");
  }

说到委托,不得不提一下我们的事件,那么什么是事件呢?EVENT?Click Event,Load Event,一连串的概念冲击着我小小的脑袋,那么到底是什么事件呢?事件是类在发生其关注的事情时用来提供通知的一种方式,事件的发生一般都牵扯到两个角色,一个是事件发行者(Publisher),也称作是发送者(Sender),其实就是一个对象,这个对象会自行维护本身的状态信息,当本身状态信息变动时,便触发一个事件,并通知所有的事件订阅者;另一个是事件订阅者(Subscriber),对事件感兴趣的对象,也称为Receiver,可以注册感兴趣的事件,在事件发行者触发一个事件后,会自动执行这段代码,我们来举一个简单的例子,看看我们的“事件”是如何在我们的编程世界中完美体现的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    //发布者(Publiser)
    public class Publisher
    {
        //声明一个花店的委托
        public delegate void PublishEventHander();
        //在委托的机制下我们建立一个花店事件
        public event PublishEventHander OnPublish;
        //事件必须要在方法里去触发,花店出售康乃馨方法
        public void issue()
        {
            //如果有人预定了这个事件,也就是这个事件不是空
            if (OnPublish != null)
            {
                Console.WriteLine("表达爱意的康乃馨今天出售哦!");
                OnPublish();
            }
        }
    }

    //Subscriber 预定者,妹妹
    public class Jiejie
    {
        //对事件感兴趣的事情,这里指对花店康乃馨感兴趣
        public static void Receive()
        {
            Console.WriteLine("噢耶,我已经收到表达爱意的康乃馨!!");
        }
    }

    //Subscriber 预定者,妹妹
    public class Meimei
    {
        //对事件感兴趣的事情
        public static void Receive()
        {
            Console.WriteLine("妹妹,辛苦了!");
        }
    }

    class Story
    {
        public static void Main(string[] args)
        {
            //实例化一个花店
            Publisher publisher = new Publisher();

            //给这个出售康乃馨事件感兴趣的预定者,此例中是妹妹
            publisher.OnPublish += new Publisher.PublishEventHander(Jiejie.Receive);
            //另一种事件注册方式
            //publisher.OnPublish += Jiejie.Receive;

            //发布者在这里触发出售康乃馨者的事件
            publisher.issue();

            Console.ReadKey();
        }
    }
}

运行效果如下:

事件是一种特殊的委托,我们来看看两者的使用流程有什么不一样的地方:

事件和委托有着密切的关系,声明一个事件语法和声明一个委托及其相似,唯一的区别就是添加Event关键字,她没有返回值,虽然一般用Public关键字修饰,但是事件无法在外部触发,而委托却可以在外部直接调用,.Net Framework使用委托来提供实现事件驱动的机制,委托是一个方法列表,事件可以看成是委托的特例。C#之旅,未完,待续......

C#之委托和事件的更多相关文章

  1. .NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...

  2. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  3. [转载]C#深入分析委托与事件

    原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.c ...

  4. [转载]C#委托和事件(Delegate、Event、EventHandler、EventArgs)

    原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委 ...

  5. C#委托与事件

    一.在控制台下使用委托和事件 我们都知道,C#中有"接口"这个概念,所谓的"接口"就是定义一套标准,然后由实现类来具体实现其中的方法,所以说"接口,是 ...

  6. C#委托与事件的简单使用

    前言:上一篇博文从原理和定义的角度介绍了C#的委托和事件.本文通过一个简单的小故事,来说明C#委托与事件的使用方法及其方便之处. 在阅读本文之前,需要你对委托和事件的基本概念有所了解.如果你是初次接触 ...

  7. C#之委托与事件

    委托与事件 废话一堆:网上关于委托.事件的文章有很多,一千个哈姆雷特就有一千个莎士比亚,以下内容均是本人个人见解. 1. 委托 1.1 委托的使用 这一小章来学习一下怎么简单的使用委托,了解一些基本的 ...

  8. [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件

    在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...

  9. .NET委托和事件

    .net学习之委托和事件   1.什么是委托 通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器 上传图片: 2.委托语法 准备一个方法:string Hello(string ...

  10. C#委托和事件

    委托和事件都可以用来调用跟自己方法签名一样的方法,两者在使用中主要有以下区别: 委托和事件没有可比性,因为委托是类型,事件是对象: 委托可以在声明它的类外部进行调用,而事件只能在类的内部进行调用: 委 ...

随机推荐

  1. MyBatis 查询映射自定义枚举

    背景                  MyBatis查询若想映射枚举类型,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用         ...

  2. Eclipse调试(2)——各种类型断点设置

    本文是Eclipse调试(1)--基础篇 的提高篇.分两个部分: 1) Debug视图下的3个小窗口视图:变量视图.断点视图和表达式视图 2) 设置各种类型的断点 变量视图.断点视图和表达式视图 1. ...

  3. Unity UGUI实现分段式血条

    我们可以看到像英雄联盟等游戏里英雄头顶的血条显示并非是纯色的,而是根据血量的多少而显示一定量的格子,这种方式明显是比较友好.比较美观的,事实上我们的游戏里面也想实现这样的效果,那该怎么办呢?根据血量的 ...

  4. Oracle EBS各个模块日志收集的方法

    MSCA(Mobile Supply Chain Application)日志的收集 Reference Note:338291.1 - Howto Enable WMS / MSCA Logging ...

  5. Pycharm中进行Python远程开发

    http://blog.csdn.net/pipisorry/article/details/52269952 PyCharm提供两种远程调试(Remote Debugging)的方式:    配置远 ...

  6. Unity UGUI图文混排(五) -- 一张图集对应多个Text

    继上一篇说的更新了一张图集对应多个Text的功能,为了节省资源嘛 这里,但是也没有舍弃之前的一个Text一个图集,因为我感觉应该两个都有用,于是我重新写了一个脚本 1.其实大体跟前面的都没变,解析标签 ...

  7. Android4.3 屏蔽HOME按键返回桌面详解(源码环境下)

    点击打开链接 首先声明我是做系统开发的(高通平台),所以下面介绍的方法并不适合应用开发者. 最经有个需求要屏蔽HOME按键返回桌面并且实现自己的功能,发现以前的方式报错用不了,上网搜索了一下,发现都是 ...

  8. Android View框架总结(二)View焦点

    请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52263256 前言:View框架写到第六篇,发现前面第二篇竟然没有, ...

  9. Linux系统编程-----进程fork()

    在开始之前,我们先来了解一些基本的概念: 1. 程序, 没有在运行的可执行文件 进程, 运行中的程序 2. 进程调度的方法: 按时间片轮转 先来先服务 短时间优先 按优先级别 3. 进程的状态: 就绪 ...

  10. 最简单的视频网站(JavaEE+FFmpeg)

    本文记录一个最简单的视频网站系统.此前做过一些基于JavaEE中的SSH (Strut2 + Spring + Hibernate)的网站系统,但是一直没有做过一个视频网站系统,所以就打算做一个&qu ...