`

委托与事件的区别

 
阅读更多

 

 事件有发送者和接收方。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。       在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。(浅显的说:例如,我要吃饭,事件的发送者是我,但我并不知道谁将做饭给我吃,是妻子呢,还是老妈呢,还是老爸呢等等。所以引出了委托,就是这个事件交给谁做。 

委托好比一个指挥官,指向妻子,妻子做,指向老妈,老妈做
Public delegate [返回值] delegatename(委托的名字)(参数列表……..)
Public event DelegateName(自定义的一个委托) MyClick;

事件是一种特殊的委托,因为事件是对委托的封装,就像字段被封装成属性,因为对于事件来讲内部永远是private的,外部只能“注册自己+=、注销自己-=”,在本类是可以用=的(赋值一个方法),外界不可以注销其他的注册者,外界不可以主动触发事件,从而起到封装的作用;而委托时可以=的,即赋值,这样委托就重新new了之前+=或者赋值的都不存在了,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能=、不能外部触发事件。所以简单来说事件就是对委托的封装,防止外部类对其进行赋值;

 

 

namespace DelegateAndEvent

{

    public delegate void GreetingDelegae(string name);

    public class Manager

    {

        public GreetingDelegae delegate1;

        public event GreetingDelegae event1;

 

        public void Greeting(string name)

        {

            if (delegate1 != null)

                delegate1(name);

            if (event1 != null)

                event1(name);

            event1 = Test;//在定义事件的本类中时可以赋值的

        }

 

        public void Test(string name)

        {

        }

    }

}

 

 

 

 

namespace DelegateAndEvent

 

{

 

    /// <summary>

 

    /// MainWindow.xaml 的交互逻辑

 

    /// </summary>

 

    public partial class MainWindow : Window

 

    {

 

        public MainWindow()

 

        {

 

            InitializeComponent();

 

            Manager m = new Manager();

 

            m.delegate1 = English;//委托的话可以用=号,即赋值

 

            m.delegate1 += Chinese;

 

            m.delegate1 = Chinese;//如果是再加这句那么之前加的就都没有了,因为委托时public的,外部可以更改的,这是为什么要有event

 

            //因为event外部只能+=和-=,不能赋值,只有内部才可以赋值,这样就保护了该事件成员在外部不会被new了

 

            m.event1 += new GreetingDelegae(English);//不能=的,会出错

 

            m.event1 += new GreetingDelegae(Chinese);

 

        }

 

 

 

        public void English(string name)

 

        {

 

            MessageBox.Show("hello," + name);

 

        }

 

        public void Chinese(string name)

 

        {

 

            MessageBox.Show("你好," + name);

 

        }

 

    }

 

}

 

分享到:
评论

相关推荐

    C#中委托与事件的区别

    委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件。对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件...

    unity-委托事件的用法和差别

    展示了委托和事件的用法,一节委托和事件的区别!!!!!

    C# 委托与事件的概念及理解

    委托和事件这两个概念是完全配合的。委托可以看成是函数指针,那就是说,它能够引用对象方法,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个对象方法,将其作为它构造函数的参数。

    详解C#委托,事件与回调函数

    详解C#委托,事件与回调函数

    事件和委托的详细区别

    本DOC,主要的是在C#中的事件,委托的区别的特别详细的描述。

    C#--委托和事件

    学习C#毕竟之路,对事件编程,入门级介绍,全面而且细致

    C#委托与事件PPT

    委托与事件讲解ppt,可以让从0开始学C#的人了解委托与事件的区别和联系

    窗体传值 委托与事件的比较

    通过分别写委托、事件的代码,明确展示这两种方法的窗体传值的共同点与区别,适合初学者上手练习~

    浅析C#委托和事件实例

    当第一次听到委托、事件时感觉比较抽象、很好奇,当看到老师在课堂上利用委托和事件实现两个窗体调用时、感觉委托太神奇了,呵、不废话了……  C#委托和事件在做程序是很常见到的,对于像我这样的接触C#不是很长的...

    C#中委托和事件的区别实例解析

    主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下

    c_中如何深入理解“事件与委托”.doc

    事件与委托似乎很难以理解,这是因为它们的使用方式与常用的编码有很大的差别,例如通常编写的都是同步代码,调用一个类型的方法,会即刻出现方法执行的结果,这是符合逻辑的。但在某些情况中,同步代码未必满足需求...

    事件高级用法及兼容写法

    1)事件对象:当浏览器执行事件的时候,会将所有与事件相关的内容(鼠标位置,触发的目标等)封装为一个对象,并且在触发事件的函数,在事件函数中进行传递 Event 常见属性: clientX clinetY 鼠标相对客户端的位置 ...

    js事件on动态绑定数据,绑定多个事件的方法

    一.on(‘clcik’)与$(”).clcik()方法的区别: on(‘clcik’):事件委托机制 // 在body元素上绑定click事件处理函数handler,如果这个click事件是由其后代的P元素触发的,就执行handler $(document.body).on(“click...

    jquery绑定事件 bind和on的用法与区别分析

    事件冒泡也是委托事件的原型,事件委托就是子类的事情委托给父类的去做 最直观的区别就是on绑定比bind绑定多一个参数‘childSelector’ 语法 $(selector).on(event,childSelector,data,function) 参数 描述 ...

    DOM事件的区别

    DOM事件的区别

    C#委托浅析与漫谈

     委托是C#区别于其他语言的一个特色,用它我们能写出简洁优雅的代码、能很方便的实现对象间的交互。  初学者可能会觉得委托体系很复杂:lambda表达式、语句lambda、匿名方法、委托、事件,光名词一堆。其实这些...

    C#.net期末复习题

    事件是不是一种委托? 答 : 委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的引用。 是,是一种特殊的委托 5.override与重载的区别 答 : override 与重载的区别。重载是方法的...

    js常见经典面试题汇总

    js常见面试题汇总 1.js的数据类型 2.双等和三等的区别 3.js中布尔值为false的六种情况 ...20.事件委托的理解 21.call、apply、bind的区别 22.js闭包 23.内存泄漏怎么理解 24.哪些操作会造成内存泄露

    C#中委托用法实例分析

    通俗的来讲,委托除了必须指定delegate关键字和没有方法实体之外,和指定方法没有更多区别。你可以当它是一个占位符,比如你在写代码的时候并不知道你将要处理的是什么。你只需要知道你将要引入的参数类型和输出类型...

Global site tag (gtag.js) - Google Analytics