c#中的delegate(委托)和event(事件)

委托: 托付其他人做这件事   ,包括 托付自己  ,即  一个方法 可以  调用 没有关系的其他方法 , 也可以 将委托传递过去 ,回调自己的方法 ,且 可以自定义参数 ,非常方便 互相传值, 适合解耦 关系。

示例:

public delegate void ChangeMoney(object s, int n);   // 用 delegate  声明委托

1、 调用 其他方法

售卖 页面添加商品,添加 的 商品 在另一个页面也能看见 。

售卖页面 类里面 定义委托:

//定义一个委托
                        public delegate void GetProductHander(List<MarkingModel> mlist);
                  // 将创建的委托和特定事件关联
                  public static event GetProductHander getproduct;

//点击添加商品时  调用 委托方法:

if(点击添加商品)

{

getproduct.Invoke(_list);

}

另一个页面调用委托:

ProductSaleMarketing.getproduct += new ProductSaleMarketing.GetProductHander(GetList);

// 将 要调用的 GetList 方法 放到  getproduct  (从类里面点出来)后面。 以及实现 GetList 方法

private void GetList(List<MarkingModel> _mlist)
                        {

}

2.  相当于回调方法

这个要在类外面定义委托 ,因为 回调  是 在其他页面实例化委托 ,调用 连接的方法。  谁在后边 后边调用谁。

public delegate void ChangeMoney(object s, int n);  // 在页面外边  声明委托   其他页面都可调用

public partial class TiHuoBill : BaseForm
{

//多窗口共用事件
                            private void sn_EveDelSelectNumber(object cash, int n)
                                {
                                    ChangePay(cash, n);
                                 }

//现金
                          private void btnCash_Click(object sender, EventArgs e)
                      {
                             var sn = new ShowNumber(7);
                                   sn.CardMoney = _daishou;
                                   sn.EveDelSelectNumber += sn_EveDelSelectNumber;  //  主要就是 这句话  委托在ShowNumber 页面 实例化了, +=   即  那个页面执行后  调用 sn_EveDelSelectNumber
                                   sn.ShowDialog();
                     }

}

ShowNumber 页面 :

public ChangeMoney EveDelSelectNumber;   //  实例化委托

// 确定关闭页面的时候

private void btnSure_Click(object sender, EventArgs e)
                     {

EveDelSelectNumber(SelectMoney, SelectType);  // 调用委托 并传值   或者这种方式:   EveDelSelectNumber.Invoke(SelectMoney, SelectType);

}

暂时发现 委托 可以使用这两种方式

其中  delegate  和 event  效果 是一样的

区别  :event与delegate的区别
 首先,通过加入event关键字,在编译的时候编译器会自动针对事件生成一个私有的字段(与此事件相关的委托),以及两个访问器方法,即add访问器方法以及remove访问器方法,用于对事件的注册及注销(对事件使用+=及-=操作时就是调用的这两个方法)。
我想你们的问题主要是,实际上声明一个委托类型的字段也可以实现这些功能。
实际上之所以采用event而不直接采用委托,实际上还是为了封装。可以设想一下,如果直接采用公共的委托字段,类型外部就可以对此字段进行直接的操作了,比如将其直接赋值为null。
而使用event关键字就可以保证对事件的操作仅限于add访问器方法以及remove访问器方法(即只能使用+=及-=)

Msdn中,有一段话描述Delegate和Event之间的关系,其实很简单:

        声明事件:若要在类内声明事件,首先必须声明该事件的委托类型。

    委托还适用于 观察者模式:

                 

    class Program
    {
        static void Main(string[] args)
        {
            var car = new Car(15);
            new Alerter(car);
            car.Run(120);
        }
    }

    class Car
    {
        public delegate void Notify(int value);
        public event Notify notifier;

        private int petrol = 0;
        public int Petrol
        {
            get { return petrol; }
            set
            {
                petrol = value;
                if (petrol < 10)  //当petrol的值小于10时,出发警报
                {
                    if (notifier != null)
                    {
                        notifier.Invoke(Petrol);
                    }
                }
            }
        }

        public Car(int petrol)
        {
            Petrol = petrol;
        }

        public void Run(int speed)
        {
            int distance = 0;
            while (Petrol > 0)
            {
                Thread.Sleep(500);
                Petrol--;
                distance += speed;
                Console.WriteLine("Car is running... Distance is " + distance.ToString());
            }
        }
    }

    class Alerter
    {
        public Alerter(Car car)
        {
            car.notifier += new Car.Notify(NotEnoughPetrol);
        }

        public void NotEnoughPetrol(int value)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("You only have " + value.ToString() + " gallon petrol left!");
            Console.ResetColor();
        }
    }

看完了上面的代码后,你可能会问:为什么不在public int Petrol中直接调用Alerter.NotEnoughPetrol呢?因为Car模块和Alerter模块本身是两个独立的子系统,如果直接调用,耦合性就会增加,这不是我们愿意看到的。

其实以上的代码是设计模式中的观察者模式(观察者模式又称Source/Listener模式)的实现,当汽车在运行中汽油量<10时,警报器便会发出警报。在上面代码中,Delegate相当于一个存放回调函数的函数指针,使用Delegate,我们可以非常方便地实现观察者模式。而其实,在需要使用回调函数时,我们都可以考虑使用Delegate。

不知道你有没有发现在上面的代码中还有一个问题呢?

public event Notify notifier;

上面的代码中,我们定义了一个Event,而事实上:

public Notify notifier;

这样写,也完全可以满足我们的需求,这就引出了我们的另一个问题,Delegate和Event!  如上 有说明。

参考:   谈C#中的Delegate

event与delegate的区别

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

时间: 2024-10-10 17:20:38

c#中的delegate(委托)和event(事件)的相关文章

.NET进阶篇-语言章-2-Delegate委托、Event事件

知识只有经过整理才能形成技能 整个章节分布简介请查看第一篇 内容目录 一.概述 二.解析委托知识点 1.委托本质 2.委托的使用 3.委托意义 逻辑解耦,减少重复代码 代码封装支持扩展 匿名方法和Lambda表达式 异步多线程 多播委托 三.事件 四.总结 一.概述 先说下委托,委托我们也经常用到.详尽了解委托是必要的,不然在异步多线程的编程中会一头雾水.委托本质就是一个类,和我们平常定义的类没多大区别.只是这个类的作用的是描述一些方法,没有数据成员.一个委托定义了一类拥有同样返回类型和参数的方

自定event事件之全局初始化中自动触发(二)

利用(一)组件:Y_GLOBAL_EVENT 场景:界面加载后在COMPONENTCONTROLLER触发自定义event事件 首先要搞懂WebDynpro启动时的hokeMethod执行顺序如下图: 从上至下,依次进行 从执行顺序中可以看出加载完VIEW视图之后,最后会执行COMPONENTCONTROLLER中的一个叫WDDOPOSTPROCESSING方法, 所以我们可以利用该方法将触发event. METHOD wddopostprocessing . wd_this->fire_tes

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

一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和event的简单用法吧,希望能给初学者带来帮助.PS:别像我那样学了几年c#到头来都不知道delegate和event怎么用. 二.delegate到底是什么东西 孩子,C语言总学过吧,如果你学得不像我那么差的话,函数指针总用过吧,就算没用过总听说过吧,嗯,大胆的告诉你,你完全可以把delegate理

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

原文 : http://www.cnblogs.com/zhangchenliang/archive/2012/09/19/2694430.html 一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天 就趁月黑风高的夜晚简单来谈谈delegate和event的简单用法吧,希望能给初学者带来帮助.PS:别像我那样学了几年c#到头来都不知道 delegate和event怎么用. 二.delegate

看看可爱c#中的delegate(委托)和event(事件)用法好不好

一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和event的简单用法吧,希望能给初学者带来帮助.PS:别像我那样学了几年c#到头来都不知道delegate和event怎么用. 二.delegate到底是什么东西 孩子,C语言总学过吧,如果你学得不像我那么差的话,函数指针总用过吧,就算没用过总听说过吧,嗯,大胆的告诉你,你完全可以把delegate理

事件和委托(Event vs. Delegate)-事件阉割版的Delegate

引言 关于事件和委托的文章看过很多,但总是记不完整.尤其是在给别人讲解的时候总是很零碎,所以在此整理一下,也供大家参考,很请大家不吝赐教. 本文从一个子类如何触发基类的事件(Event),引出事件和委托的共性和区别.再简单分析下背后原因,深层原因也给大家提供了部分参考资料.欢迎大家留言讨论.   问题 "如果我想在子类里触发父类的事件(Event)应该如何实现?"(可以先自己做下或者想下,再继续看您的做法是否也曾有我碰到技术误区)   问题分解为两步: 父类定义了一个事件(Event)

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

C#中的委托(Delegate)和事件(Event) 2007-11-30 11:40:00 分类: 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式——观察者(Observer)有一个参考. 委托和事件应该是C#相较于C++等之前的非托管的语言提出的一个新的术语(term).“旧瓶装新酒”这样的描述似乎有些“贬义”,但确实是这样.委托也好,事件也好最初的起源是C/C++中的函数指针,关于函数指针的简单介绍可以参见我以前的一篇<C/C++中指向函数的

浅谈c#中的delegate和event了

一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那就趁着阳光明媚的早晨简单来谈谈delegate和event的简单用法吧,希望能给初学者带来帮助.PS:别像我那样学了几年c#到头来都不知道delegate和event怎么用. 二.delegate到底是什么东西 孩子,C语言总学过吧,如果你学得不像我那么差的话,函数指针总用过吧,就算没用过总听说过吧,嗯,大胆的告诉你,你完全可以把delegate理解

jquery live() delegate() on() 事件委托的一些区别

随着DOM结构的复杂化和Ajax等动态脚本技术的运用,有了较多的动态添加进来的元素,直接用JQ添加click事件会发现新添加进来的元素并不能直接选取到,在这里就需要用到事件委托方法,JQ为事件委托提供了live().dalegate()和on()方法. 事件委托 我们知道,DOM在为页面中的每个元素分派事件时,相应的元素一般都在事件冒泡阶段处理事件.在类似 body > div > a 这样的结构中,如果单击a元素,click事件会从a一直冒泡到div和body(即document对象).因此