zoukankan      html  css  js  c++  java
  • C#基础之事件

    C#基础之事件(1)

    1.事件的定义
    暂且给它定义为:在对象的某种状态发生变化时,能自动执行的一个或多个方法的代理。不理解不要紧,继续往下看。
    事件定义之前先声明一个委托,然后声明一个事件:

     //声明委托
     public delegate void GetStrHandler(string x, string y);
     //声明事件
     public event GetStrHandler GetStr;

    2.事件的三要素

    事件拥有者:也叫事件发布者,很显然,谁定义事件谁就是事件的拥有者。具体到代码中也就是哪个类中定义了的事件,那么这个类的实例就是事件的拥有者
    事件订阅者:可理解为“盯着”事件拥有者的某个行为的对象。
    事件处理方法:事件触发后要执行的方法。当事件订阅者“发现”事件拥有者的事件被触发时,事件订阅者需要去执行的方法
                            事件处理方法是定义在事件订阅者中,后面的代码会体现出来

    3.上代码

    using System;
    namespace ProDemo2
    {
        class Program
        {
            static void Main(string[] args)
            {
                TestA a = new TestA();
                TestB b = new TestB(a);
                //5.事件的触发在代码中就是a.Do("a", "b");这一句。a.Do("a", "b")实际上是调用了对象b中的OnGetStr方法,
                //所谓的事件“订阅”相当于是把符合委托“模板”(委托,两个参数没有返回值,这个委托又和事件组合在一起)的方法OnGetStr传递过去,最终执行的是OnGetStr方法。这样的语言描述可能不准确,得多体会才行。
                a.Do("a", "b");//事件的触发
                Console.ReadKey();
            }
            //1.首先定义一个委托类型:void GetStrHandler(string x, string y),为事件的声明作准备
            public delegate void GetStrHander(string x, string y);
            //2.定义事件拥有者的类,即class TestA,事件拥有者是这个类的实例对象即TestA a = new TestA();中定义的a。
            //因为事件GetStr,是在TestA这个类中定义的,也就是事件的拥有者。
            public class TestA
            {
                //事件类型与委托一起  GetStr最终还是一个事件,闪电符号
                //声明事件
                public event GetStrHander GetStr;
                public void Do(string x,string y)
                {
                    GetStr(x, y);//事件与订阅者的关系枢纽,承上启下的作用,上:就是包含在发布者中。下:就是可以在订阅者中关联具体的方法
                }
            }
            //3.定义事件订阅者的类,即class TestB ,事件拥订阅者是这个类的实例对象即TestB b = new TestB(a);中定义的b,
            //仔细看看TestB的构造方法,发现它依赖于对象a,这是因为订阅者需要监听事件拥有的事件(这句的"监听"也就是当TestA有啥动静,这边及时作出反应),
            //因此需要把事件拥有者“引”进来,使订阅者能实现事件订阅
            public class TestB
            {
                private TestA _A;
                public TestB(TestA a)
                {
                    _A = a;
                    _A.GetStr += OnGetStr;//事件的订阅
                    _A.GetStr += onGetStr2;//后面再追加一个订阅,也就是多播委托
                }
                //4.定义事件处理方法:事件处理方法是在订阅者中定义的,表示事件触发时需要执行的方法。
                //这里就是执行了“Console.WriteLine(string.Format("{0}+{1}", x, y));”这个动作。
                private void OnGetStr(string x, string y)
                {
                    Console.WriteLine(string.Format("{0}+{1}", x, y));
                }
                public void onGetStr2(string x, string y)
                {
                    Console.WriteLine(string.Format("{0}-{1}", x, y));
                }
            }
        }
    }

    4.总结
    以上是对事件的一个基本运用作了一个简单描述。实际上事件订阅者是可以有多个,也就会有多个事件处理程序,事件就变成一个对象与另外一个或者多个对象的交互。
    当然事件拥有者也可以定义多个不同的事件,提供给不同的事件订阅者订阅。上面只是事件运用的方式之一,事件的拥有者和订阅者可以是其它形式,如静态类等,不一定是类的实例。

  • 相关阅读:
    【annoy】高维空间求近似最近邻
    【tf安装版本】linux安装tensorflow,和cuda, cudnn版本对应关系
    【pip】国内镜像地址
    【linux】文件压缩分包与批量解压
    【腾讯词向量】腾讯中文预训练词向量
    【数据集】中文语音识别可用的开源数据集整理
    【模型部署】使用Flask部署算法模型
    【debug】python在import Flask的时候报错cannot import name 'dump_age'
    【敏感词检测】用DFA构建字典树完成敏感词检测任务
    2021年最新JAVA基础面试题共91道含答案(二)图灵学院
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/14153716.html
Copyright © 2011-2022 走看看