一、Delegate委托可以理解为一个方法签名。

    可以将方法作为另外一个方法的参数带入其中进行运算。在C#中我们有三种方式去创建委托,分别如下:

public delegate void Print(string str);

static void delegatemethod(string str)
        {
            Console.WriteLine(str);
        }

public static void Main()
        {
            #region 委托
            //1.普通委托
            var print1 = new Print(delegatemethod);
            print1("这是普通方式创建的委托");
            //2.匿名委托
            Print print2 = delegate(string str) {
                Console.WriteLine(str);
            };
            print2("这是匿名方式创建的委托");
            //3.lambda委托
            Print print3 = (string str) => {
                Console.WriteLine(str);
            };
         }

二、Event事件,是一种封装过的委托。

    它拥有以下三要素:

    1.事件发行者-达到某些条件时激发事件的对象

    2.事件订阅者-订阅事件并对事件发生时进行处理的对象

    3.定义发行者和订阅者关系,一个发行者可能会有多个订阅者。

  三、事件和委托的区别

    1.委托允许直接通过委托去访问相应的处理函数,而事件只能通过公布的回调函数去调用

    2.事件只能通过“+=”,“-=”方式注册和取消订户处理函数,而委托除此之外还可以使用“=”直接赋值处理函数。

  最后我们可以看看整个自定义事件的处理办法以及事件和委托的区别如下代码:

//事件参数
    public class My_EventArgs : EventArgs
    {
        private string _args = string.Empty;
        public My_EventArgs(string args)
        {
            _args = args;
        }
        public string Args
        {
            get { return _args; }
        }
    }

//事件发行者
    public class SourceClass
    {
        public double Width { get; set; }
        public double Height { get; set; }

My_EventArgs Evargs;
        public SourceClass(string args)
        {
            Evargs = new My_EventArgs(args);
        }
        //定义委托
        public delegate void EventHandler(object sender, My_EventArgs args);

#region 使用委托方式声明
        public EventHandler Clicked;
        public void ClickedAsync()
        {
            if (Clicked != null)
            {
                Clicked(this, Evargs);
            }
        }
        #endregion
        #region 使用事件方式声明
        public event EventHandler Click;
        public void ClickAsync()
        {
            if (Click != null)
            {
                Click(this, Evargs);
            }
        }
        #endregion
    }
    //事件订阅者
    public class Del
    {
        public delegate void Print(string str);

static void delegatemethod(string str)
        {
            Console.WriteLine(str);
        }

public static void Main()
        {
            #region 委托
            //1.普通委托
            var print1 = new Print(delegatemethod);
            print1("这是普通方式创建的委托");
            //2.匿名委托
            Print print2 = delegate(string str) {
                Console.WriteLine(str);
            };
            print2("这是匿名方式创建的委托");
            //3.lambda委托
            Print print3 = (string str) => {
                Console.WriteLine(str);
            };
            print3("这是lambda方式创建的委托");
            #endregion

#region 事件
            SourceClass source = new SourceClass("我的事件被触发");
            source.Width = 5.0;
            source.Height = 3.0;
            //一、委托方式允许source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));调用
            source.Clicked = new SourceClass.EventHandler(source_RightClick);
            source.Clicked += new SourceClass.EventHandler(source_LeftClick);
            source.ClickedAsync();
            source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));
            //二、很明显用户希望通过使用source.ClickedAsync();去调用函数,而非直接使用上行代码去调用,所以在这里需要使用Event关键字进行申明
            //注1.事件方式不允许source.Clicked(source, new My_EventArgs("我使用委托方式调用的Args"));直接调用
            //注2.事件不允许 source.Click = new SourceClass.EventHandler(source_LeftClick);直接赋值
            source.Click += new SourceClass.EventHandler(source_LeftClick);
            source.ClickAsync();
            //注销事件和注册事件
            source.Click -= new SourceClass.EventHandler(source_LeftClick);
            source.Click += new SourceClass.EventHandler(source_RightClick);
            source.ClickAsync();
            Console.ReadLine();
            #endregion
        }
        //事件处理方法1
        static void source_LeftClick(object sender, My_EventArgs args)
        {
            SourceClass source = sender as SourceClass;
            Console.WriteLine("目标宽度:" + source.Width + ",目标高度:" + source.Height);
            Console.WriteLine("目标对象参数:"+args.Args);
           
        }

//事件处理方法2
        static void source_RightClick(object sender, My_EventArgs args)
        {
            SourceClass source = sender as SourceClass;
            Console.WriteLine("目标面积:" + source.Width *source.Height);
        }
    }

运行的效果图如下:

C#中Delegate和Event以及它们的区别(转载)的更多相关文章

  1. C#知识点总结系列:3、C#中Delegate和Event以及它们的区别

    1.Monitor.Enter(object)方法是获取锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 ...

  2. jQuery中delegate与on的用法与区别

    在jQuery1.7中 .delegate()已被.on()取代.对于早期版本,它仍然使用事件委托的最有效手段. 在事件绑定和委派,delegate()和on在一般情况下,这两种方法是等效的. .de ...

  3. C#知识点总结系列:3、C#中Delegate和Event

    一.Delegate委托可以理解为一个方法签名. 可以将方法作为另外一个方法的参数带入其中进行运算.在C#中我们有三种方式去创建委托,分别如下: public delegate void Print( ...

  4. php中global与$GLOBALS的用法及区别-转载

    php中global 与 $GLOBALS[""] 差别 原本觉得global和$GLOBALS除了写法不一样觉得,其他都一样,可是在实际利用中发现2者的差别还是很大的! 先看下面 ...

  5. Java中List、Set和Map的区别--转载

    List按对象进入的顺序保存对象,不做排序或编辑操作.Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List).Map同样 ...

  6. Java中print、printf、println的区别(转载)

    printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和print基本没什么差别,就是最后会换行 System.out.p ...

  7. SQL中on条件与where条件的区别(转载)

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: 1. on条件是在生成临时表时使用的条 ...

  8. css中单位px和em,rem的区别[转载]

    PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位: 3. Firefox能够调整px和em,rem,但是96%以上 ...

  9. JavaScript中var、let和const的区别(转载)

    一.前言 在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var . let . c ...

随机推荐

  1. MySQL server has gone away的解决方法

    用Python写了一个http服务,需要从mysql读数据库,第一天还好好的,第二天突然不行了.报错如下: pymysql.err.OperationalError: (2006, 'MySQL se ...

  2. QuickFIX/J常见问题汇总

    最近在搞QuickFIX/J,网上的资料不算很多,遇到一些简单的问题都需要google一阵才能找到解决方法,因此做点记录: 错误:Rejecting invalid message: quickfix ...

  3. Opencv step by step - 加载视频

    刚买了本 "学习Opencv" 这本书,慢慢看起来. 一开始就是加载视频了.当然了,首先你要有个视频 从这里下载了一个: tan@ubuntu:~$ wget http://www ...

  4. Chrome扩展开发之四——核心功能的实现思路

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  5. Ruby On Rails 常用的精品Gem汇总

    首先需要注明一点,本文是原创的并不是从其它地方转载.所有的数据是我从 GitHub 和 RubyGems 上码下来的,数据的截取时间就是本文的发布日期. RubyGems 的下载量可以看到在用这个 g ...

  6. ios-遍历和排序

    // // main.m // OC-遍历和排序-homework // // Created by dllo on 16/2/25. // Copyright © 2016年 dllo. All r ...

  7. Daily Scrum – 1/12

    Meeting Minutes Merge Wordlist & Word Recite entry. (P0) – Done. Remove "Word Challenge&quo ...

  8. 日志框架对比 NLog VS Log4net

    Log4net 先说Log4net,它是.net平台上一个老牌的日志框架,我接触的时间也不长(因为公司有自己的日志库),但是看着各开源库都在用这个于是前段时间也尝试去了解了一下. 首先让我认识到Log ...

  9. javascript与服务器2

    一, 通过IE建立XMLHTTP请求 这种请求方式源自与微软创建了XMLHTTP请求对象,只要用户的机器上安装了MSXML就可以发送XMLHTTP请求来创建客户端和服务器端的通信, XMLHTTP请求 ...

  10. Java-如何挖取某个网站中的ajax请求信息

    通常情况,通过网络爬虫挖取到的基本为网页静态内容,而动态ajax取数的内容是我个人暂时不知如何一次性把网站中的ajax获取 这里介绍的是某个网站中的某一个ajax多某个table刷新,期数据,并提供其 ...