委托和事件

一、委托:是一个能够引用方法的对象。创建委托时实际是创建一个方法引用的对象,创建的引用对象能够调用方法。

  委托调用可以调用不同的方法,只需改变方法的引用即可。即委托调用方法是运行时确定,而非编译时确定。

  就像声名一个object实例一样,声名的只是一个占位符,具体指向哪个对象在运行时可以动态指定。在委托中指定方法有限制:返回值,参数类型要相同。

  

  委托声名:delegate ret-type delegatename(parameter-list)

  delegate 关键字声名委托

  ret-type是委托返回值类型

  delegatename 委托名称

  parameter-list 参数列表

  委托声名的是一个方法引用对象,被委托引用的方法返回值类型、形参类型必须与委托定义的相同,不限制是静态方法、还是实例方法。

  

  委托示例:  

   //委托使用静态方法声名
            StrMethodDelegate strdelegate = new StrMethodDelegate(StaticMethodClass.StaticStrMethod);
            //调用方法
            string result = strdelegate("HI");
            Console.WriteLine(result);

            //委托使用实例方法声名
            InstanceClass instanceClass = new InstanceClass();
            StrMethodDelegate instanceDelegate = new StrMethodDelegate(instanceClass.InstanceStrMethod);
            result = instanceDelegate("Hi");

  运行结果:

  

   

 委托方法组转换:允许简单的为委托指定方法名称,不再使用new或者显示的调用构造函数。实际操作就像是变量赋值一样把方法赋值给方法引用。

  委托方法转换示例:  

            VoidMethodDeleteage voidDelegateone = StaticMethodClass.FirstStaticEmpMethod;
            voidDelegateone();
            VoidMethodDeleteage voidDelegatetwo = new InstanceClass().FirstInstanceEmpMethod;
            voidDelegatetwo();

  运行结果:

  

  委托多播:多播是指委托有创建方法调用列表,方法调用链表的能力。通过+、+=、-、-=运算符为链表添加方法。

  示例代码:  

    VoidMethodDeleteage multi =             StaticMethodClass.FirstStaticEmpMethod;
            multi += StaticMethodClass.SecondStaticEmpMethod;

            InstanceClass incclass = new InstanceClass();

            multi += incclass.FirstInstanceEmpMethod;

            multi();

            multi -= incclass.FirstInstanceEmpMethod;

            multi();    

  运行结果:

  

  匿名方法赋值给委托

  使用delegate关键字创建匿名方法,可以赋值给委托。  

VoidMethodDeleteage delte = delegate
            {
                for (int i = 0; i <= 5; i++)
                {
                    Console.Write(i);
                    Console.Write(" ");
                }
            };

            delte();

  运行结果:

  

  Lambda赋值给委托  

 StrMethodDelegate delegateInc = n =>
            {
                return "Lambda ReturnValue:" + n;
            };

            string returnstr = delegateInc("Hello");
            Console.WriteLine(returnstr);

  运行结果:

  

  使用匿名函数和lambad表达式和实例方法、静态方法一样能够进行方法的调用。

  协变、逆变

  协变是指:只要方法的返回值类型派于委托声明的返回类型,该方法就可赋值给委托。

  逆变是指:只要方法参数的类型是委托声明类的父类,该方法即可赋值给委托。

 

二、事件:事件是基于委托类型,事件是一种信号机制,通知应用程序操作发生。

  工作原理是:如果对象对某事件感兴趣,则对象为事件注册事件的处理程序,事件发生时就会调用注册在事件上的处理程序。

  

  事件声明:使用Event关键字声明事件。

  Event event-delegate event-name

  Event声明事件关键字

  event-delegate 支持事件的委托声明,意思事件的注册程序通过委托来承载。

  event-name 具体的事件对象的名称。

  事件示例:  

delegate void MyEventHandle();
 static void Main(string[] args)
        {
            EventDemo demo = new EventDemo();
            //注册事件
            demo.SomeEvent += Handler;
            //事件发生
            demo.OnSomeEvent();
            Console.ReadKey();
        }

        public static void Handler()
        {
            Console.WriteLine("Event ocurred");
        }
    class EventDemo
    {
        public event MyEventHandle SomeEvent;

        //触发事件
        public void OnSomeEvent()
        {
            if (SomeEvent != null)
            {
                SomeEvent();
            }
        }
    }

  运行结果:

  

  

  事件多播

  事件是基于委托创建,所以事件是支持事件多播。

  事件多播示例  

            EventDemo demo = new EventDemo();
            //注册事件
            demo.SomeEvent += Handler;
            //事件多播,
            demo.SomeEvent += MoreMethod.MoreMethodForEvent;

            //事件发生
            demo.OnSomeEvent();
            Console.ReadKey();

  运行结果:

  

  

  事件存取器

  事件存取器类似属性存取器操作,通过存取器对事件控制更加灵活。

  事件可以使用匿名函数、和Lambda表达式,由于事件基本委托,所以事件的匿名函数、Lambda表达式同委托一样。

  

  .NET事件的指导原则

   为了使编写的组件与window兼容,开发人员需要遵循Microsoft建立的指导原则。事件处理程序必须有两个参数,

   第一个参数是产生事件的对象的引用,第二个参数为EventArgs类型。

   为了使事件遵循指导原则,再声明委托时使用delegate void MyEvent(object sender,EventArgs e),当然如果

    委托这么声明,那么委托调用的方法也要这样定义。

时间: 2024-10-26 00:27:56

委托和事件的相关文章

C#高级知识点概要(1) - 委托和事件

作者:linybo 要成为大牛,必然要有扎实的基本功,不然时间再长项目再多也很难有大的提升.本系列讲的C# 高级知识点,是非常值得去撑握的,不仅可以让你写代码时游刃有余,而且去研究和学习一些开源项目时,也不会显得那么吃力了. 希望大家记住,这里讲的所有的知识点,不仅仅是了解了就可以了,还要会灵活用,一定要多思考,撑握其中的编程思想. 本文讲的是委托和事件,这两个词可能你早就耳熟能详,但你是否真正撑握了呢? 本系列讲的C#高级知识点都是要求开发时能达到可以徒手写出来的水平(不依赖搜索引擎.找笔记等

委托与事件

委托在底层就是一个函数的指针,委托是事件的基础. 你可以传递引用类型.值类型.但是你有没有需要传一个方法呢?传方法的过程就是委托. 消息类: public class Message { /// <summary> /// 传引用类型 /// </summary> /// <param name="msg"></param> public static void Send(string msg) { Console.WriteLine(&

C#学习(一):委托和事件

预备知识 在学习委托和事件之前,我们需要知道的是,很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知. 而发布者/订阅者模式可以满足这种需求.简单来说,在这种模式中,发布者定义了一系列程序的其他部分可能感兴趣的事件.其他类可以"注册",以便再这些事件发生时发布者可以通知它们.这些订阅者类通过向发布者提供一个方法来"注册"以获取通知.当事件发生时,发布者"触发事件",然后执行订阅者提交的所有事件.

C#中委托和事件

目 录 1.1 理解委托 2 1.1.1 将方法作为方法的参数 2 1.1.2 将方法绑定到委托 4 1.2 事件的由来 6 1.2.1 更好的封装性 6 1.2.2 限制类型能力 9 1.3 委托的编译代码 10 1.4 .NET 框架中的委托和事件 11 1.4.1 范例说明 11 1.4.2 Observer 设计模式简介 12 1.4.3 实现范例的Observer 设计模式 13 1.4.4 .NET 框架中的委托与事件 14 1.5 委托进阶 16 1.5.1 为什么委托定义的返回值

C#委托和事件定义和使用

委托 定义委托的语法和定义方法比较相似,只是比方法多了一个关键字delegate ,我们都知道方法就是将类型参数化,所谓的类型参数化就是说该方法接受一个参数,而该参数是某种类型的参数,比如int.string等等:而委托是将方 法参数化,说了上面的那个类型参数化之后,相信你也能猜到方法参数化的意思了,对,就是将方法作为一个参数传到一个委托中. 首先来看看声明委托的语句: public deletate void MyDelegate(); public:访问修饰符  delegate:关键字 

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

原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html 引言 本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Deleg

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

原文链接:http://blog.csdn.net/zwj7612356/article/details/8272520 14.1.委托 当要把方法作为实参传送给其他方法的形参时,形参需要使用委托.委托是一个类型,是一个函数指针类型,这个类型将该委托的实例化对象所能指向的函数的细节封装起来了,即规定了所能指向的函数的签名,也就是限制了所能指向的函数的参数和返回值.当实例化委托的时候,委托对象会指向某一个匹配的函数,实质就是将函数的地址赋值给了该委托的对象,然后就可以通过该委托对象来调用所指向的函

C#语法之委托和事件

从大学就开始做C#这块,也做C#几年了,最近又从ios转回.Net,继续做C#,之前也没有写博客的习惯,写博客也是从我做ios的时候开始的,现在既然又做回了.net,那就写点关于.Net的博客,可能在大牛眼里这些都是简单基础的,不过回过头看我当时初学的时候觉得委托事件是不容易理解的,我这里也是想着联系着OC,两者有比较的学习下.毕竟都是面向对象语言,思想是相通的. 委托在OC中类似block,都是指向一个函数,其实他没和C++的函数指针类似.但委托还是和函数指针不太一样,委托是完全面向对象的,是

C#综合揭秘——深入分析委托与事件

本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Delegate 使 Observer(观察者)模式的使用变得更加简单.在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用.最后一节,将介绍Predicate<T>.Action<T>.Func<T,TResult>多种泛型委托的使用和Lamb

C#——委托与事件

首先,来了解一下什么是委托,什么是事件,这两者之间有什么区别? 委托: (1)是一种数据类型,可以像类一样声明数据类型,声明变量 (2)只有委托才能将方法当做变量来保存 (3)不同类型的方法需要使用不同的委托类型来存储,所以不同类型的方法需要定义不同的类来存储不同的对象 (4)同一种方法可以使用同一个委托类型来存储 先通过一小段代码来了解一下 //先定义一个委托,委托也可以声明变量,还有返回值 public delegate void MyDelegate(); public delegate