• 委托与事件


    学习了.NET这么久,却一直对委托和事件两个概念一知半解,今天就仔细研究了下,写出来与大家分享:

    委托和事件的概念性的东东:

    1、委托是对函数的封装,可以看作是给方法特征的一个名称,

    2、委托是一种引用方法类型(委托是引用类型,创建实例时用new),一旦为委托分配了方法,委托就与该方法具有完全相同的行为,

    3、事件是委托类型的对象,类或对象可以通过事件通知其他类或对象发生相关的事情 

    4、事件的实现是基于委托的,

    下面通过代码来感受下

        //创建猫类
    class Cat
    {
    string name;
    public Cat(string name)
    {
    this.name = name;
    }
    //声明委托
    public delegate void CatShoutDelegate();
    //声明委托类型为CatShoutDelegate的事件OnCatShout
    public event CatShoutDelegate OnCatShout;//事件分为 订阅者、发起者、处理
    //创建方法
    public void Shout()
    {
    Console.WriteLine("喵,我是"+name);
    if(OnCatShout!=null)
    {
    OnCatShout();//表示当Shout方法发生时,如果事件有订阅者 就执行OnCatShout
    }
    }
    }
    //创建老鼠类
    class Mouse
    {
    string name;
    public Mouse(string name)
    {
    this.name = name;
    }
    public void Run()
    {
    Console.WriteLine("猫来了,{0}快逃命吧", name);
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Cat cat = new Cat("Tom");
    Mouse m1 = new Mouse("Miqi");
    Mouse m2 = new Mouse("Jerry");
    //事件订阅者并附带处理Run方法
    cat.OnCatShout+=new Cat.CatShoutDelegate(m1.Run);
    cat.OnCatShout+=new Cat.CatShoutDelegate(m2.Run);
    //事件发起者
    cat.Shout();
    Console.ReadKey();
    }
    }

    在Main方法中我们只调用了Cat类中的Shout方法;

    Shout方法是事件的发起者 通过+=运算符来订阅事件, Run方法是事件发生时的处理方法。

    后面再讲下委托和事件的别(面试经常问到)
    1、其实他们不惧可比性,因为委托是引用类型,而事件是委托类型的对象

    2、事件的实现是基于委托的,通过用反编译器我们可以看到当我们定义的事件实质上是由两个方法add和remove实现的  通过下面的代码我们可以看到事件有点像委托类型的属性。事件有一个好处就是我们只能增加和减少订阅者 而不能直接给事件赋值 例如赋值为null 是很危险的 因为如果我们很多订阅者都在监听同一个事件 当设置为null的时候 其他人就不能监听到事件啦。

    View Code
    public event CatShoutDelegate OnCatShout
    {
    add
    {
    CatShoutDelegate delegate3;
    CatShoutDelegate onCatShout = this.OnCatShout;
    do
    {
    delegate3 = onCatShout;
    CatShoutDelegate delegate4 = (CatShoutDelegate) Delegate.Combine(delegate3, value);
    onCatShout = Interlocked.CompareExchange<CatShoutDelegate>(ref this.OnCatShout, delegate4, delegate3);
    }
    while (onCatShout != delegate3);
    }
    remove
    {
    CatShoutDelegate delegate3;
    CatShoutDelegate onCatShout = this.OnCatShout;
    do
    {
    delegate3 = onCatShout;
    CatShoutDelegate delegate4 = (CatShoutDelegate) Delegate.Remove(delegate3, value);
    onCatShout = Interlocked.CompareExchange<CatShoutDelegate>(ref this.OnCatShout, delegate4, delegate3);
    }
    while (onCatShout != delegate3);
    }
    }

    以上只是个人很浅显的总结  希望大家 继续跟进 积极评论!!!

  • 相关阅读:
    神经网络
    密度峰值聚类
    kylin从入门到实战:实际案例
    [时间序列分析][3]--自相关系数和偏自相关系数
    时间序列分析之指数平滑法(holt-winters及代码)
    时间序列模型
    python3.5如何安装statsmodels包?
    时间序列分析和预测
    Xshell6和Xftp6 破解免安装版,无窗口多开限制
    优化问题
  • 原文地址:https://www.cnblogs.com/duolete/p/2371761.html
Copyright © 2020-2023  润新知