精华内容
下载资源
问答
  • 委托与事件

    2016-11-17 15:58:00
    http://www.cnblogs.com/imstrive/p/6069607.html
  • 委托与事件调用示例

    2018-10-18 18:03:39
    实现基本的委托与事件的联合使用,主要区分了方法所在的位置
  • 委托事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托事件。对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托事件...
  • 委托与事件,举例描述了委托与事件,非常易懂,值得一看!强烈推荐
  • 一个简单的委托与事件的 demo,通过timer控件不断触发,而更新时间!帮助理解委托与事件的实际运用
  • 不错的文章(.net)--泛型、委托与事件解析
  • c#中的委托与事件

    2018-10-30 15:22:36
    声明委托相当声明一个新的类,所以可以在声明类的地方声明委托,可在类外声明,也可以在 * 类中声明 * 3.可以在委托的声明前加上任意的修饰符,public private * 4.定义委托之对应的方法必须具有相同的方法...
  • C#委托与事件初探

    2020-09-02 19:18:43
    事件委托的一种特殊形式,当发生有意义的事情时,事件处理对象通知过程。接下来通过本文给大家介绍C#委托与事件初探,感兴趣的朋友一起学习吧
  • 天轰穿老师VS2010趣味编程视频教程,第25讲,委托与事件实例浅析,FLV格式,压缩包自带10%恢复记录
  • 本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托事件的由来、.Net Framework中的委托事件委托事件对Observer设计模式的意义,对它们的中间代码也做了讨论
  • 窗体间的传值,最好使用委托方式传值,开始之前,我们先来说一下委托与事件的关系。 委托:是一个类。 事件:是委托类型的一个特殊实例,只能在类的内部触发执行。 首先创建2个窗体,这里我们以form1为发送窗体,...
  • 1,资源来源于网络,共享 2,基于两个窗体的信息交互 3,使用了委托的方式实现信息交互 4,父窗口调用子窗口,并通过子窗口控制父窗口
  • 通过分别写委托事件的代码,明确展示这两种方法的窗体传值的共同点区别,适合初学者上手练习~
  • 主要给大家介绍了如何通过一篇文章彻底搞清楚c#中的委托与事件,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 根据经典的实例,详细而全面的介绍了c#委托与事件,以及他们之间的关系
  • C#委托与事件案例.rar

    2020-03-18 15:06:14
    之前开发中需要用到委托与事件,找了半天终于找到了Winform下有用的例子,大家一起学习,亲测可用。
  • [第25讲:委托与事件实例浅析(C#视频教程 + C#源代码).zip] 根据【田洪川 天轰穿 C#视频教程】的【第25讲:委托与事件实例浅析】实现,VS2010编译运行正常。 源代码视频教程中略有不同! 本人不是天轰穿,在此对...
  • 事件:就是基于委托定义的。 public event GreetingDelegate payxx; 其实这里的事件payxx 就差不多和string 一样可,只不过是存函数指针的变量。 这里上一个例子代码: using UnityEngine; using System....
  • C#教材_委托与事件.ppt

    2020-03-01 22:18:44
    第八章 委托与事件 目标 实现委托 定义和引发事件 概述 委托事件在.NET framework中的应用非常广泛然而较好地理解委托事件对很多刚刚接触C#的学员来说并不容易它们就像一道坎儿觉得真是太容易了而没有过去的人...
  • winform委托事件经典例子,委托事件 winform 传值 子传父 父传子
  • C# 委托与事件 猫鼠问题示例。通过猫叫老鼠跑,来展示委托与事件。即通过传递把一个类的方法传递给另外一个类的事件(+=方式注册),在另外一个类中执行事件
  • 委托提供C++中“函数指针”相同的功能,用于传递和调用函数的引用,是观察者模式的一种实现。 事件是用委托实现的,是对委托的额外封装,其本质上是一种特殊的委托事件的作用 封装订阅: 事件委托的订阅...

    委托提供与C++中“函数指针”相同的功能,用于传递和调用函数的引用,是观察者模式的一种实现。

    事件是用委托实现的,是对委托的额外封装,其本质上是一种特殊的委托。

    事件的作用

    • 封装订阅: 事件将委托的订阅操作进行封装,仅允许 += 和 -= 操作,避免程序员在开发时因误用 = 使得委托链断裂
    • 封装发布: 事件确保只有包含它类才能触发事件通知,杜绝在委托中出现的“订阅者”也能触发

    本篇使用分别使用委托和事件来实现简单的观察者模式例子,三个版本输出完全相同,为方便对比,使用了最原始的delegate语法。读者可以对比三版的不同之处来了解两者的区别。

     

    委托版本

    using System;
    
    namespace LearningDelegate
    {
        class Program
        {
            static void Main(string[] args)
            {
                //出版社有一本叫《故事会》的杂志
                Publisher publisher = new Publisher("《故事会》");
    
                //读者小A订了这本杂志
                Observer observerA = new Observer("小A");
                publisher.Magazine += observerA.RecieveMagazine;
    
                //读者小B也订了这本杂志
                Observer observerB = new Observer("小B");
                publisher.Magazine += observerB.RecieveMagazine;
    
                //出版社印刷本月的《故事会》
                publisher.PublishingMagazine();
    
                Console.ReadLine();
            }
        }
    
        //读者
        class Observer
        {
            public Observer(string _name)
            {
                name = _name;
            }
            public string name;
    
            public void RecieveMagazine(string message)
            {
                Console.WriteLine("{0}收到了{1}, 仔细阅读了一番。", this.name, message);
            }
        }
    
        //出版社
        class Publisher
        {
            public Publisher(string magName)
            {
                magazineName = magName;
            }
    
            public string magazineName;
    
            public delegate void MagazineDelegate(string message);
            public MagazineDelegate Magazine;
    
            public void PublishingMagazine()
            {
                //如果没人订,就不用印了
                //此处必须判断Delegate对象是否为空,调用空的Delegate对象会引发异常
                if (Magazine != null)
                {
                    Magazine(magazineName);
                }
            }
        }
    }

    委托有一个特点:由于委托的订阅和触发都直接作用于delegate对象,这导致委托可以在可订阅的空间中被触发,也就是说我们无法将委托的触发封装起来。而事件event对象只能在其定义的类中被触发。

     

    一个最最简单的事件版本

    using System;
    
    namespace LearningDelegate
    {
        class Program
        {
            static void Main(string[] args)
            {
                //出版社有一本叫《故事会》的杂志
                Publisher publisher = new Publisher("《故事会》");
    
                //读者小A订了这本杂志
                Observer observerA = new Observer("小A");
                publisher.Magazine += observerA.RecieveMagazine;
    
                //读者小B也订了这本杂志
                Observer observerB = new Observer("小B");
                publisher.Magazine += observerB.RecieveMagazine;
    
                //出版社印刷本月的《故事会》
                publisher.PublishingMagazine();
    
                Console.ReadLine();
            }
    
        }
    
        //读者
        class Observer
        {
            public Observer(string _name)
            {
                name = _name;
            }
            public string name;
    
            public void RecieveMagazine(string message)
            {
                Console.WriteLine("{0}收到了{1}, 仔细阅读了一番。", this.name, message);
            }
        }
    
        //出版社
        class Publisher
        {
            public Publisher(string megName)
            {
                magazineName = megName;
            }
    
            public string magazineName;
    
            public delegate void MagazineDelegate(string message);
            //使用自定义的委托类型和event关键字创建事件对象
            public event MagazineDelegate Magazine;
    
            public void PublishingMagazine()
            {
                //如果没人订,就不用印了
                //此处必须判断事件对象是否为空
                if (Magazine != null)
                {
                    Magazine(magazineName);
                }
            }
        }
    }

    这个最最简单的事件,就是给原有的委托加了一层event关键字的封装,增加了上述的两个特性。这个简单的例子只能用于了解委托和事件语法的差别,下面给出标准的事件语法的版本。

     

    标准的事件版本

    using System;
    
    namespace LearningDelegate
    {
        class Program
        {
            static void Main(string[] args)
            {
                //出版社有一本叫《故事会》的杂志
                Publisher publisher = new Publisher("《故事会》");
    
                //读者小A订了这本杂志
                Observer observerA = new Observer("小A");
                publisher.Magazine += observerA.RecieveMagazine;
    
                //读者小B也订了这本杂志
                Observer observerB = new Observer("小B");
                publisher.Magazine += observerB.RecieveMagazine;
    
                //出版社印刷本月的《故事会》
                publisher.PublishingMagazine();
    
                Console.ReadLine();
            }
        }
    
        //读者
        class Observer
        {
            public Observer(string _name)
            {
                name = _name;
            }
            public string name;
    
            //接受信息的函数要与Event的格式保持一致,输入一个object对象和Event消息类
            public void RecieveMagazine(object sender, Publisher.MagazineMessage magazineMessage)
            {
                Console.WriteLine("{0}收到了{1}, 仔细阅读了一番。", this.name, magazineMessage.Message);
            }
        }
    
        //出版社
        class Publisher
        {
            //事件传递的消息必须封装到一个类中,该类必须继承EventArgs类
            public class MagazineMessage : EventArgs
            {
                public MagazineMessage(string mes)
                {
                    message = mes;
                }
    
                private string message;
    
                public string Message { get => message; set => message = value; }
            }
    
            public Publisher(string megName)
            {
                magazineName = megName;
            }
            public string magazineName;
    
            //定义Event
            public event EventHandler<MagazineMessage> Magazine;
            //EventHandler<MagazineMessage> 的原型是一个泛型委托:delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)
    
    
            //调用Event,Event只能在自己定义类中被触发调用
            public void PublishingMagazine()
            {
                //与Delegate一样,此处必须判断event对象是否为空,调用空的Event/Delegate对象会引发异常
                if (Magazine != null)
                {
                    Magazine(this, new MagazineMessage(magazineName));
                }
            }
        }
    }

     

    什么时候用委托?什么时候用事件?(个人观点)

    由上可知,从语法上,我们可以使用event关键字将任意委托转化为事件。那么简而言之,出于代码健壮性考虑,如果一个委托不需要在其定义的类之外进行触发,那就将其转化为事件,保证它不会在不可知的情况下被触发。

     

    更为深层的关于委托和事件的理解,请看下列参考资料。

    参考资料

    1. 《C#本质论》
    2. C# 事件浅析
    3. 大白话系列之C#委托与事件讲解 系列

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 126,992
精华内容 50,796
关键字:

委托与事件