大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。本篇分别通过委托和事件执行多个方法,从中体会两者的区别。

□ 通过委托执行方法

    class Program
    {
        static void Main(string[] args)
        {
            Example example = new Example();
            example.Go();
            Console.ReadKey();
        }
    }
    public class Example
    {
        public delegate void DoSth(string str);
        internal void Go()
        {
            //声明一个委托变量,并把已知方法作为其构造函数的参数
            DoSth d = new DoSth(Print);
            string str = "Hello,World";
            //通过委托的静态方法Invoke触发委托
            d.Invoke(str);
        }
        void Print(string str)
        {
            Console.WriteLine(str);
        }
    }

以上,

○ 在CLR运行时,委托DoSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。
○ 委托DoSth定义了方法的参数和返回类型
○ 通过委托DoSth的构造函数,可以把符合定义的方法赋值给委托
○ 调用委托的实例方法Invoke执行了方法

但,实际上让委托执行方法还有另外一种方式,那就是:委托变量(参数列表)

    public class Example
    {
        public delegate void DoSth(object sender, EventArgs e);
        internal void Go()
        {
            //声明一个委托变量,并把已知方法作为其构造函数的参数
            DoSth d = new DoSth(Print);
            object sender = 10;
            EventArgs e = new EventArgs();
            d(sender, e);
        }
        void Print(object sender, EventArgs e)
        {
            Console.WriteLine(sender);
        }
    }

以上,

○ 委托DoSth的参数列表和方法Print的参数列表还是保持一致
○ 委托DoSth中的参数object sender通常用来表示动作的发起者,EventArgs e用来表示动作所带的参数。

而实际上,委托变量(参数列表),事件就是采用这种形式执行方法的。

□ 通过事件执行方法

    public class Example
    {
        public delegate void DoSth(object sender, EventArgs e);
        public event DoSth myDoSth;
        internal void Go()
        {
            //声明一个委托变量,并把已知方法作为其构造函数的参数
            DoSth d = new DoSth(Print);
            object sender = 10;
            EventArgs e = new EventArgs();
            myDoSth += new DoSth(d);
            myDoSth(sender, e);
        }
        void Print(object sender, EventArgs e)
        {
            Console.WriteLine(sender);
        }
    }

以上,

○ 声明了事件myDoSth,事件的类型是DoSth这个委托
○ 通过+=为事件注册委托
○ 通过DoSth委托的构造函数为事件注册委托实例
○ 采用委托变量(参数列表)这种形式,让事件执行方法

而且,通过+=还可以为事件注册多个委托。

   public class Example
    {
        public delegate void DoSth(object sender, EventArgs e);
        public event DoSth myDoSth;
        internal void Go()
        {
            //声明一个委托变量,并把已知方法作为其构造函数的参数
            DoSth d = new DoSth(Print);
            DoSth d1 = new DoSth(Say);
            object sender = 10;
            EventArgs e = new EventArgs();
            //为事件注册多个委托
            myDoSth += new DoSth(d);
            myDoSth += new DoSth(d1);
            myDoSth(sender, e);
        }
        void Print(object sender, EventArgs e)
        {
            Console.WriteLine(sender);
        }
        void Say(object sender, EventArgs e)
        {
            Console.WriteLine(sender);
        }
    }

以上,通过+=为事件注册1个或多个委托实例,实际上,还可以为事件直接注册方法。

    public class Example
    {
        public delegate void DoSth(object sender, EventArgs e);
        public event DoSth myDoSth;
        internal void Go()
        {
            object sender = 10;
            EventArgs e = new EventArgs();
            //为事件注册多个委托
            myDoSth += Print;
            myDoSth += Say;
            myDoSth(sender, e);
        }
        void Print(object sender, EventArgs e)
        {
            Console.WriteLine(sender);
        }
        void Say(object sender, EventArgs e)
        {
            Console.WriteLine(sender);
        }
    }

□ 通过EventHandler执行方法

先来看EventHandler的源代码。

可见,EventHandler就是委托。现在就使用EventHandler来执行多个方法。

    public class Example
    {
        public event EventHandler myEvent;
        internal void Go()
        {
            object sender = 10;
            EventArgs e = new EventArgs();
            //为事件注册多个委托
            myEvent += Print;
            myEvent += Say;
            myEvent(sender, e);
        }
        void Print(object sender, EventArgs e)
        {
            Console.WriteLine(sender);
        }
        void Say(object sender, EventArgs e)
        {
            Console.WriteLine(sender);
        }
    }

总结:
○ 委托就是一个类,也可以实例化,通过委托的构造函数来把方法赋值给委托实例
○ 触发委托有2种方式: 委托实例.Invoke(参数列表),委托实例(参数列表)
○ 事件可以看作是一个委托类型的变量
○ 通过+=为事件注册多个委托实例或多个方法
○ 通过-=为事件注销多个委托实例或多个方法
○ EventHandler就是一个委托

C#中委托和事件的区别相关推荐

  1. 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别...

    在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...

  2. java委托事件与观察者模式_多播委托与观察者模式联合使用,以及委托与事件的区别...

    首先我们先看一下多播委托: 使用委托时,首先我们声明委托,委托语法一共有四种类型,分别时有参,无参,以及有无参数返回值. 1 public class DelegateShow //: System. ...

  3. 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate

    由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...

  4. C#中委托与事件的使用-以Winform中跨窗体传值为例

    场景 委托(Delegate) 委托是对存有某个方法的引用的一种引用类型变量. 委托特别用于实现事件和回调方法. 声明委托 public delegate int MyDelegate (string ...

  5. 一个简单的c++/cli中委托与事件的处理模型

    // EventPractice.cpp: 主项目文件. #include "stdafx.h" using namespace System; delegate void f( ...

  6. C#中委托、事件和回调的用法说明

    参考链接: C#中的委托和事件 - Part.1 - 技术 - 张子阳的博客 分分钟用上C#中的委托和事件 - 雾中人 - 博客园 C#回调函数的简单讲解与应用例子(最简单讲解,大神绕道)_sajia ...

  7. CSharp(C#)语言_委托和事件区别详解

    委托和事件区别详解 委托和事件的概念 委托 事件 委托和事件的作用 委托 事件 委托和事件的区别 委托和事件的详细解答请看C#系列文章 委托和事件代码实践 委托 事件 总结 委托和事件的概念 委托   ...

  8. C#中在定义事件委托时怎样跨窗体传递参数

    场景 C#中委托与事件的使用-以Winform中跨窗体传值为例: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100150700 ...

  9. C#委托与事件学习笔记

    今天跟随视频学习了一下C#中最重要的一些概念之委托与事件.老杨的视频讲的还是挺深入浅出,不过刚接触C#.NET的人还是朦朦胧胧,就像张子阳先生说的"每次见到委托和事件就觉得心里别(biè)得 ...

最新文章

  1. hadoop 023.0与hadoop 1.0 io.serializable分析
  2. Java黑皮书课后题第5章:**5.27(显示闰年)编写程序,显示从101到2100期间所有闰年,每行显示10个。数字之间用一个空格字符隔开,同时显示这期间闰年的数目
  3. 《ASP.NET Core 微服务实战》-- 读书笔记(第10章)
  4. 计算机二级mysql工具_2020年全国计算机二级MySQL复习知识点:优化工具
  5. Python中enumerate对象的用法与特点
  6. python创建maven工程_Maven项目
  7. Linux基础命令--grep/find
  8. DSP之直接存储器访问控制器
  9. MySQL之用Mysql-Proxy实现读写分离
  10. Internet路由之路由表查找算法概述-哈希/LC-Trie树/256-way-mtrie树
  11. 使用Wagtail一段时间后的感受
  12. 厉害了,我的谷歌小弟
  13. iphone中按Home键退出程序
  14. 专知原创和整理了一些中英文机器学习从入门到精通的资料,和大家分享一下
  15. 张勇:阿里云是一家云计算产品公司,要坚定走向“产品被集成”
  16. git lfs的安装和使用
  17. DevOps入门系列--前瞻性--前瞻性记忆
  18. Chap和pap认证
  19. 触角云开发的微信商城系统
  20. MybatisPlus入门学习

热门文章

  1. html 解析 qt,windows下用QTwebkit解析html
  2. mysql用any查询_mysql 5.6有ANY_VALUE功能吗?
  3. mysql pdo 读取字段名_PDO如何处理SQL语句中对字段名以及表名的转义
  4. 插值法补齐缺失数据_数据挖掘非常重要的一步:数据预处理
  5. response.setcontenttype的參数
  6. linux安装golang!!
  7. cuDNN编写卷积实例
  8. Windows下redis使用及安装
  9. 排序算法的总结——Java实现
  10. Swift语言高速入门