C#笔记-委托&事件

1.1.委托

可以认为委托是持有一个或多个方法的对象。被执行时会执行他所有“持有” 的方法

可以把它看一个类型安全的, 面向对象的c++函数指针

委托和类一样, 是一种用户自定义的类型。而委托持有一个或多个方法。

delegate void Mydel(int value); // 声明一个委托类型

#声明一个委托, 看上去和方法声明相似,只是没有实现块。

#使用该委托类型声明一个委托变量。

#创建一个委托的对象,赋值给委托变量。新的委托对象包括指向某个方法的引用,签名(包括ref,out)和返回类型一致。可以增加方法

#可以像调用方法一样调用委托。包含的每一个方法都会被执行。可以是实例方法也可以是静态方法。

#调用带返回值的委托。 最后一个方法返回的值就是委托的返回值, 其它方法返回值都会被忽略

#调用带引用参数的委托时参数值可能会改变。在执行每个方法时的参数值不同

delegate void PrintFunction();

class Program

{

}

1.2.委托使用匿名方法

#声明委托yojgjf作为初始化的表达式。

#为委托增加事件时在赋值语句的右边

#除了数组参数,参数列表必须与委托匹配:参数数量,类型及位置, 修饰符

#可以省略圆括号来简化参数列表,但必须满足2个条件:委托参数列表不包含out参数;不使用参数

#如果委托声明有params参数,那么匿名方法的参数列表将忽略params 关键字。

1.3.Lambda表达式

#允许我们省略类型参数(隐式类型)。 如果只有一个隐式类型参数,我们可以省略圆括号;

#允许表达式的主体是语句块或表达式

#有ref , out 参数时必须注明类型(显式类型)

#如果没有参数,必须使用一组空的圆括号

2.1 发布者/订阅者模式

发布类定义了一系列事件 , 其他类可以“注册”, 以便在这些事件发生时发布者可以通知他们。 这些订阅者类通过向发布者提供一个方法来“注册”以获取通知。当事件发生时。 发布者“触发事件”, 然后执行订阅者提交的所有事件。

2.2 事件

事件就像是专门用于某种特殊用途的简单委托。事件包含了一个私有委托。

#事件提供了对它的私有控制委托的结构化访问。也就是说, 你无法直接访问委托。

#事件中可用的操作比委托要少, 对于事件我们只可以添加,删除或调用事件处理程序。只能用“+= , -="

#事件上被触发时, 它调用委托来依次调用“调用列表”中的方法。

    delegate void Handler(); // 声明委托
    //发布者
    class Incrementer
    {
        pulbic event Handler CountedADozen; //创建事件并发布

        public void DoCount()
        {
            for (int i = 1; i < 100; i++)
                if (i % 12 == 0 && CountedADozen != null)
                    CountedADozen ();
        }
    }

    //订阅者
    class Dozens
    {
        public int DozensCount { get; private set; }
        public Dozens( Incrementer incrementer )
        {
            DozensCount = 0;
            incrementer.CountedADozen += IncrementDozensCount; //订阅事件
        }

        void IncrementDozensCount() //声明事件处理程序
        {
            DozensCount++;
        }

    }
    class Program
    {
        static void Main()
        {
            Incrementer incrementer = new Incrementer ();
            Dozens dozensCounter = new Dozens (incrementer);
            incrementer.DoCount ();
            Console.WriteLine ("{0}", dozensCounter.DozensCount);
        }
    }

2.3 标准事件

System命名空间声明的委托类型

public delegate void EventHandler(object sender, EventArgs e);

EventArgs类声明在System命名空间中,设计为不参传递任何数据,通常会被忽略。如果你希望传递数据,必须声明一个派生自EventArgs的类,使用合适的字段来保存数据。

    class Incrementer
    {
        public event EventHandler CountedADozen; //使用系统定义的EventHandler
        public void DoCOunt()
        {
            for (int i = 1; i < 100; i++)
                if (i % 12 == 0 && CountedADozen != null)
                    CountedADozen (this, null); //触发事件时使用参数
        }

    }

    class Dozens
    {
        public int DozensCount{get; private set;}
        public Dozens(Incrementer incrementer)
        {
            DozensCount = 0;
            incrementer.CountedADozen += IncrementDozensCount;
        }

        void IncrementDozensCount(object source, EventArgs e )
        {
            DozensCount++;
        }

    }
时间: 2024-11-03 19:05:30

C#笔记-委托&事件的相关文章

C#委托事件

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

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle&lt;T&gt;

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以

观察者(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

学习笔记---Javascript事件Event、IE浏览器下的拖拽效果

学习笔记---Javascript事件Event.IE浏览器下的拖拽效果     1. 关于event常用属性有returnValue(是否允许事件处理继续进行, false为停止继续操作).srcElement(触发事件的事件源对象)和attachEvent("onclick",function(){...}); 2. a. 实现拖放(Drag and Drop): 目前支支持IE, 若定制某对象为可拖放对象, 则必须覆盖目标对象的dragenter和dragover事件, 可以用e

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委托的事件

javascript - 工作笔记 (事件四)

在javascript - 工作笔记 (事件绑定二)篇中,我将事件的方法做了简单的包装, JavaScript Code 12345   yx.bind(item, "click", function (e) {         //console.log("Div Click 1 !");         alert("Div Click 1 !");         e.stopPropagation();     }); 但是这样用起来有些

委托事件的理解

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

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

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