C#委托,事件最初浅的和最易看懂的学习笔记

对于委托和事件,看了不少博文,当时好像都理解了,过了一段时间,又忘记的差不多了。每每如此,感觉自己很笨,记性差,其实是没有深入理解透切,没有按照自己的语言表达出来,当然容易忘记。今天又花了一些时间,好好理解,总结别人的文章,用自己文字概况出来。

总结如下:

委托可以定义任何地方,应该说是委托声明

事件类可以单独放一个地方,包含一些属性

事件一定定义在发布者里面,应该说是事件声明,并在这里做判断注册事件,给事件类属性赋值

订阅者,也就是事件的受理者,它里面有些方法并后续操作。

客户端把发布者与订阅者关联起来。
发布者.事件+=订阅者.方法
或者
发布者.事件+=new 委托声明类.委托(订阅者.方法)
发布者.方法--调用事件的方法

代码实例

发布者

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dazilianxi.deleteevent
{
    //商家,发布商品肯定包含一些属性,就是给商品赋值实例化
    public class Provider
    {
        public delegate void DaZheEventHandler(object sender, ProductEventArgs e);//声明委托
        public event DaZheEventHandler DaZhe;//声明事件

        protected virtual void FaBuChanPin(ProductEventArgs e)
        {
            if (DaZhe != null)
            {
                this.DaZhe(this, e);//注册事件
            }
        }
        private decimal price = 18000M;
        public void ShangJia(int discout) {//事件赋值
           this.FaBuChanPin(new ProductEventArgs { Price = discout*price/10, ProAddress = "中国广东", ProName = "红日电器", Discount = discout });
        }
    }
}

事件类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dazilianxi.deleteevent
{
    //事件类,包含商品一些属性
    public class ProductEventArgs : EventArgs
    {
        public decimal Price { get; set; }
        public string ProName { get; set; }
        public string ProAddress { get; set; }
        public int Discount { get; set; }
    }
}

订阅者

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace dazilianxi.deleteevent
{//就是我们,我们有购买行为(方法)
    public class Custome
    {
        public void OnGouMai(object sender,ProductEventArgs e)
        {
            if (e.Price < 15000M)
            {
                Console.WriteLine("大家快了买,产于" + e.ProAddress + "的" + e.ProName + "打" + e.Discount + "折了。目前价格是" + e.ProName + "很划算了");
            }
            else {
                OnGuanKan();
            }
        }

        public void OnGuanKan()
        {
            Console.WriteLine("再等等看!");
        }
    }
}

客户端

class Program
    {
        static void Main(string[] args)
        {
            //客户端二者关联
            Provider shangjia = new Provider();
            shangjia.DaZhe += new Provider.DaZheEventHandler(new Custome().OnGouMai);//第一种方式
            shangjia.ShangJia(2);

            Provider shangjia2 = new Provider();
            shangjia2.DaZhe += new Custome().OnGouMai;//第二种方式
            shangjia2.ShangJia(9);
       }
}

结果图

参考:

http://www.cnblogs.com/wudiwushen/archive/2010/04/23/1717829.html

http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html

时间: 2024-12-06 10:00:52

C#委托,事件最初浅的和最易看懂的学习笔记的相关文章

C#委托事件

1.委托事件关键词:delegate 2.在声明函数的时候在函数类型后面加上 例:public delegate int Test(int x,int y) 3.定义委托变量:Test t1,委托接收的是方法引用. 4.委托变量可以当成函数的调用.用赋值“=” 委托变量 = 函数名 5.委托类型的变量,可以引用任何一个满足要求的方法,类似于C语言的函数指针. 6.一个委托变量可以使用“+=”挂接多个方法,也能使用“-=”动态地移除某个方法的引用. 7.引用多个方法的委托变量称为“多路委托”. 8

观察者(Observer)模式 * 委托事件

观察者(Observer)模式:定义了一种一对多的依赖关系.让多个观察者对象同时监听某一个主题对象.   这个主题对象发生变化时会通知所有观察者对象,使他们字段更新自己 /* * 抽象主题(Subject)角色:主题角色把所有对观察考对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者. 抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现. * 抽象观察者(Observer)角色:为所有的具体观察者定义

.Net 命名(委托,事件==)

委托及参数命名: public delegate void ClickedEventHandler(object sender, ClickedEventArgs e); ClickedEventHandler Clicked; .Net 命名(委托,事件==),布布扣,bubuko.com

jQuery Direct and delegated events 直接事件与委托事件

ref: http://api.jquery.com/on/ 直接事件: 将事件委托直接绑定到dom元素上,当事件发生时触发handler. 委托事件:  将事件委托绑定到dom元素的外层容器上,当事件发生时,冒泡到匹配的外层元素,触发相应handler. 采用委托事件的优势有2点: 1.效率高.对子元素数量非常多时,只需要绑定一个handler到父容器. 2. 可以对事件绑定调用时,尚未生成的子元素,仍然有效(只需要保证父容器已存在). jquery 使用on方法实现事件绑定. <!DOCTY

[转载]JS事件委托(事件代理)的原理以及优缺点

1,什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件. 也就是:利用冒泡的原理,把事件加到父级上,触发执行效果. 好处呢:1,提高性能. 我们可以看一个例子:需要触发每个li来改变他们的背景颜色. <ul id="ul"> <li>aaaaaaaa</li> <li>bbbbbbbb&l

C# 委托 事件 之 窗体之间互传值

C# 委托 事件 之 窗体之间互传值 效果: Form1.cs: using System; using System.Windows.Forms; namespace 窗体事件互传值2 { public delegate void SetTxb2Del(string str, object obj);//定制针对Txb2的委托 public partial class Form1 : Form { private event SetTxb2Del st2dEvent;//声明Txb2委托的事件

委托事件的理解

委托是一种带有签名的类,需要用复合这个签名的静态函数或者非静态函数来初始化,就像楚怀王说:"先入秦关者望之".此时还不知道谁会先入秦观,可能是刘邦,可能是项羽.等到时间发展到一定时机,结论出来了,这个事委托给刘邦了.前提是刘邦复合这个签名,先入秦关了. 事件和委托类似,只不过事件源于委托,声明的时候需要先定义一个委托类型.也就是委托和类同级,事件和类里的属性方法同一个级别.事件只能在定义该事件的类里被初始化和使用,除了+=和-=.而委托无此限制.事件更形象化,就像,反秦起义这个事件爆发

一场武林盟主争霸赛-观察者模式PK委托事件技术

设计模式中提到观察者模式又叫做发布-订阅(Publish-订阅)模式.它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有 观察者对象,使它们能够自动更新自己. C#中提到,委托是对函数的封装,可以当作给方法的特征指定一个名称.而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程.事件其实就是设计模式中观察者模式在.NET中的一种实现方式. 委托就是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的

对jQuery中on方法委托事件的理解

关于on方法中的委托事件,官方JQ API如下: http://api.jquery.com/on/#on-events-selector-data-handler 参考大牛阮一峰的博文: http://www.ruanyifeng.com/blog/2011/08/jquery_best_practices.html 什么时候使用委托事件: 1.对未被创建的元素添加事件监听 2.避免频繁添加或删除event handler,委托父元素来进行事件处理 使用委托事件的优点: 1.大量减少监听元素的