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

原创 2016年05月31日 11:13:13

 一、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); } }
复制代码

   运行的效果图如下:

通过IL分析C#中的委托、事件、Func、Action、Predicate之间的区别与联系

一直以来都是对于事件与委托比较混淆,而且不太会用。找了个时间,总结了一下,感觉清晰了很多。 先说一下个人理解的结论吧:    delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2015年05月04日 12:32
  • 5782

wikioi 1214 线段覆盖

题目描述 Description     给定x轴上的N(0 输入描述 Input Description     输入第一行是一个整数N。接下来有N行,每行有二个空格隔开的整数,表...
  • kingzone_2008
  • kingzone_2008
  • 2013年09月26日 14:50
  • 6795

在C++中实现委托(Delegate)

原文地址 个人理解: 说明: 最近在阅读设计模式相关的内容, 正好看到观察者模式的部分, 发现.net 有一个委托机制, 本质上就是函数指针对象。 这篇大作中...
  • zhyh1435589631
  • zhyh1435589631
  • 2016年03月18日 21:04
  • 2488

C#中Delegate和Event以及它们的区别

一、Delegate委托可以理解为一个方法签名。     可以将方法作为另外一个方法的参数带入其中进行运算。在C#中我们有三种方式去创建委托,分别如下: public ...
  • qq563129582
  • qq563129582
  • 2017年07月24日 23:01
  • 222

c#中delegate和event之间的区别

下面是网上找到的几段话,阐述event和delegate的不同之处。(1)你不想在声明delegate的类之外调用delegate,还有,除了声明delegate的类,其它类只能订阅(Subscrib...
  • goodhy
  • goodhy
  • 2011年07月06日 23:14
  • 442

C#知识点总结系列:1、C#中Hashtable、Dictionary详解以及写入和读取对比

在本文中将从基础角度讲解HashTable、Dictionary的构造和通过程序进行插入读取对比。   一:HashTable     1.HashTable是一种散列表,他内部维护很多对Key-...
  • h398085541
  • h398085541
  • 2015年07月27日 10:25
  • 224

C#知识点总结系列:1、C#中Hashtable、Dictionary详解以及写入和读取对比

在本文中将从基础角度讲解HashTable、Dictionary的构造和通过程序进行插入读取对比。   一:HashTable     1.HashTable是一种散列表,他内部维护很多对Key-...
  • crazyliyang
  • crazyliyang
  • 2013年10月30日 17:49
  • 683

C#中的事件和委托(Delegate,Event)

  • 2008年12月20日 22:30
  • 86KB
  • 下载

C#委托delegate与事件event

委托是一个类,将方法作为变量使用的一种机制,即使用委托时,可以将方法当做变量来使用(类似于C/C++的函数指针)...
  • u013867061
  • u013867061
  • 2014年07月12日 16:17
  • 390

终于会用c#中的delegate(委托)和event(事件)了

一、开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那。好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和...
  • Sayesan
  • Sayesan
  • 2016年03月03日 13:35
  • 501
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#知识点总结系列:C#中Delegate和Event以及它们的区别
举报原因:
原因补充:

(最多只允许输入30个字)