zoukankan      html  css  js  c++  java
  • 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行

    回到目录

    名称有点饶,不是很好理解,但我喜欢这种大白话,不喜欢书所翻译过来的话,呵呵!

    今天要把一个不确定的问题解决,问题是:一个程序中,有一个属性,如果它为true时,我希望把另一些方法自动运行,这是可以通过订阅事件来实现的,对吗?经过我的测试确实是这样的,呵呵。

    事件一个一直叫我们头痛的话题,一个能不用就不用的东西,我们程序员为什么那么怕“事件”呢?我来分析几个原因

    1 对本身的概念不是很理解

    2 对它的作用不是很清晰,可能书上说不到点上,个人认为

    3 平时用的少,所以对它更加陌生

    今天,我就和大家一起再学习一个C#的事件

    一说事件,就不行不说委托,这两者到底是什么关系呢,在我看来,委托就是一个类,而事件就是这个类的一个实例,呵呵,这样大家就容易理解了吧

    事件由事件数据源,事件所发生的类和事件订阅者们组成,“事件订阅者们”就是说,一个事件可以被多个订阅都订阅。

    开始写代码了,代码最能说明问题:

    事件源类:

    
    
     1  /// <summary>
     2   /// 事件源
     3   /// </summary>
     4   internal class KeyEventArgs : EventArgs
     5   {
     6       private char keyChar;
     7       public KeyEventArgs(char keyChar)
     8           : base()
     9       {
    10           this.keyChar = keyChar;
    11       }
    12 
    13       public char KeyChar
    14       {
    15           get
    16           {
    17               return keyChar;
    18           }
    19       }
    20   }
    
    
    
     

    一都是以EventArgs 结尾的,其中EventArgs 本身它是所有事件源类的基类,它不提供任何事件源信息,如果有个性化的事件信息,需要去派生它

    接下来看,发生事件的类,我们的事件就在这里发生,在什么时候,什么情况下发生,都来自这里。

     
     1  /// <summary>
     2     /// 事件发生的类
     3  /// </summary>
     4     internal class KeyInputMonitor
     5     {
     6         // 创建一个委托,返回类型为avoid,两个参数
     7         public delegate void KeyDownEventHandler(object sender, KeyEventArgs e);
     8         // 将创建的委托和特定事件关联,在这里特定的事件为OnKeyDown
     9         public event KeyDownEventHandler OnKeyDown;
    10 
    11         public void Run()
    12         {
    13             bool finished = false;
    14             do
    15             {
    16                 Console.WriteLine("Input a char");
    17                 string response = Console.ReadLine();
    18 
    19                 char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);
    20                 switch (responseChar)
    21                 {
    22                     case 'X':
    23                         finished = true;
    24                         break;
    25                     default:
    26                         // 得到按键信息的参数
    27                         KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);
    28                         // 触发事件
    29                         OnKeyDown(this, keyEventArgs);
    30                         break;
    31                 }
    32             } while (!finished);
    33         }
    34     }
    
    
    
    功能就是输入一个字符,当为X时,退出,当不为X时,去触发一个事件,事件源数据为“输入的字符”
    到这里,这个事件还没有任何功能,就相当于,我去卖东西,东西已经摆在台上了,但还没有人来买,好,现在是时候有顾客来了
     1  /// <summary>
     2     /// 显示中文的接收类
     3  /// </summary>
     4     internal class EventReceiverForChina
     5     {
     6         public EventReceiverForChina(KeyInputMonitor monitor)
     7         {
     8             // 产生一个委托实例并添加到KeyInputMonitor产生的事件列表中
     9             monitor.OnKeyDown += new KeyInputMonitor.KeyDownEventHandler(this.Echo);
    10         }
    11         private void Echo(object sender, KeyEventArgs e)
    12         {
    13           Console.WriteLine("您输入的字条是: {0}", e.KeyChar);
    14         }
    15     }

    这里订阅事件时,我们使用+=就可以了,事实上就是建立一个委托类型的新事件实例而以。

    在前台调用时,可以这样:
    
    
    1         // 实例化一个事件发送器,并声明一个EventReceiverForChina类型的订阅者
    2   KeyInputMonitor monitor = new KeyInputMonitor();
    3   EventReceiverForChina eventReceiverForChina = new EventReceiverForChina(monitor);
    4  monitor.Run();
    
    
    
    
    
    运行的结果就是当你去Run()时,eventReceiverForChina 类型时的某个方法也被执行了,怎么样,实现了我们今天的话题了吧,其实这就是事件的订阅机制,事实上在软件开发中非常有用。
    需要注意的是,一般事件的返回类型都是void,当然,这也是很正常的,因为事件就是去做某些事件,它不知道管后果的。呵呵。
    祝您晚——来个好梦吧!
    回到目录
  • 相关阅读:
    C++中的extern "C"【转】
    无题
    MATLAB中文件的读写和数据的导入导出【转】
    逝去的2012
    C/C++语言中Static的作用详述
    C++:源文件与头文件有什么区别【转】
    Bash,后台与nohup
    关于include 和 extern
    python易错点
    android实现点击两次返回键实现退出功能
  • 原文地址:https://www.cnblogs.com/lori/p/2402426.html
Copyright © 2011-2022 走看看