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

    事件是C#语言的重要成员之一,初学者往往不能很好的去理解和运用事件,特别是自定义事件。在这里将以较简单的方式呈现事件最基本的用法。

    1.事件的定义

    给事件下个准确的定义是一个较困难的事,这里我暂且给它定义为:事件是两个对象之间的交互行为,这里关注四个字“两个对象”。不理解不要紧,这样定义本身并不准确。,继续往下看。

    事件定义之前先声明一个委托,然后声明一个事件:

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

    2.事件的三要素

    学会运用事件,一定要知道事件的三要素:事件拥有者、事件订阅者、事件处理方法。

    事件拥有者:也叫事件发布者,个人觉得用拥有者更方便理解,很显然,谁定义事件谁就是事件的拥有者。具体到代码中也就是哪个类中定义了的事件,那么这个类的实例就是事件的拥有者。

    事件订阅者:可理解为“盯着”事件拥有者的某个行为的对象。

    事件处理方法:事件触发后要执行的方法。当事件订阅者“发现”事件拥有者的事件被触发时,事件订阅者需要去执行的方法。仔细口味这句话,不难发现事件处理方法是定义在事件订阅者中,后面的代码会体现出来。

    3.事件的运用

    下面看完整示例代码:

        //声明委托
        public delegate void GetStrHandler(string x, string y);
    
        public class TestA
        {
            //声明事件
            public event GetStrHandler GetStr;
            public void Do(string x, string y)
            {
                GetStr(x, y);
            }
        }
    
        public class TestB
        {
            private TestA _A;
            public TestB(TestA a)
            {
                _A = a;
                _A.GetStr += OnGetStr;//事件的订阅
            }
    
            //事件处理方法
            private void OnGetStr(string x, string y)
            {
                Console.WriteLine(string.Format("{0}+{1}", x, y));
            }
        }
        
        
         class Program
        {
            static void Main(string[] args)
            {
                TestA a = new TestA();
                TestB b = new TestB(a);
                a.Do("a", "b");//事件的触发
                Console.ReadKey();
            }
        }

    下面按2中的事件三要素来剖析这段代码:

    1.首先定义一个委托类型:void GetStrHandler(string x, string y),为事件的声明作准备。

    2.定义事件拥有者的类,即class TestA,事件拥有者是这个类的实例对象即TestA a = new TestA();中定义的a。这个类中定义了事件GetStr。

    3..定义事件订阅者的类,即class TestB ,事件拥订阅者是这个类的实例对象即TestB b = new TestB(a);中定义的b,仔细看看TestB的构造方法,发现它依赖于对象a,这是因为订阅者需要监听事件拥有的事件,因此需要把事件拥有者“引”进来,使订阅者能实现事件订阅。

    4.定义事件处理方法:在三要素中已强调过,事件处理方法是在订阅者中定义的,表示事件触发时需要执行的方法。这里就是执行了“Console.WriteLine(string.Format("{0}+{1}", x, y));”这个动作。

    5.事件的触发:在代码中就是a.Do("a", "b");这一句。通过代码发现,a.Do("a", "b")实际上是调用了对象b中的OnGetStr方法,所谓的事件“订阅”相当于是把符合委托“模板”的方法OnGetStr传递过去,最终执行的是OnGetStr方法。这样的语言描述可能不准确,得多体会才行。

    4.总结

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

  • 相关阅读:
    完美解决header,footer等HTML5标签在IE(IE6/IE7/IE8)无效的方法
    div图片垂直居中 如何使div中图片垂直居中
    为了美观当网页图片不存在时不显示叉叉图片
    谷歌HTML/CSS规范
    201521123029《Java程序设计》第十二周学习总结
    201521123029《Java程序设计》第十一周学习总结
    201521123029《Java程序设计》第十周学习总结
    201521123029《Java程序设计》第九周学习总结
    201521123029《Java程序设计》第八周学习总结
    201521123029《Java程序设计》第七周学习总结
  • 原文地址:https://www.cnblogs.com/qcst123/p/11503730.html
Copyright © 2011-2022 走看看