zoukankan      html  css  js  c++  java
  • 关于C#事件的理解

    一、一个不错的例子

    class FileFFF
        {
            public delegate void FileWatchEventHandler(object sender,EventArgs args);//当然事件必须有委托支撑,建立一个委托是必须的
            public event FileWatchEventHandler FileWatchEven;//这就是要声明的事件,其实就是委托类型的变量,前面加了一个event关键字       
            public void OnFileWatchEven(EventArgs e)//完成事件的触发,就是如何触发事件,写一个触发函数,和OnClick什么的差不多。这个写法一般都这样。
            {
                if (FileWatchEven!=null)
                {
                    FileWatchEven(this, e);
                }
            }
            public void MonitorFile()
            {
               
                while (true)
                {
                  
                    if (XXXXXXXX)
                    {
                       
                        OnFileWatchEven(EventArgs.Empty); 
                        //这个就是什么时候触发该事件,这个就是功能了,一般都是函数内部,就是执行此方法时候触发的这个事件,当然触发这个事件后该怎么处理,那是在其他处完成的
                       
                    }
    
                   
                }
            }
        }

    我们之前已经对委托和事件介绍很多了,现在写代码应该很容易了,现在在这里直接给出代码,并在注释中加以说明

    using System;
    
    using System.Collections.Generic; 
    
    using System.Text;
    namespace Delegate
    
    {     // 热水器  
    
       public class Heater
    
     {        private int temperature;    
    
        public delegate void BoilHandler(int param);  //声明委托      
    
      public event BoilHandler BoilEvent;//声明事件
           // 烧水     
    
      public void BoilWater() 
    
    {          
    
      for (int i = 0; i <= 100; i++) 
    
    {             
    
      temperature = i;
                 
    
     if (temperature > 95)
    
    {               
    
        if (BoilEvent != null) { //如果有对象注册  
    
             BoilEvent(temperature);  //调用所有注册对象的方法    
    
           }           
    
        }        
    
        }       
    
    }   
    
      }
        // 警报器  
       public class Alarm 
    {     
       public void MakeAlert(int param)
     {          
      Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);    
        }   
      }
        // 显示器    
    public class Display { 
     public static void ShowMsg(int param)
     { //静态方法            
    Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);  
      }    
     }         
     class Program
     {      
               static void Main() 
                 {        
                Heater heater = new Heater();     
                 Alarm alarm = new Alarm();
               heater.BoilEvent += alarm.MakeAlert;    //注册方法     
                heater.BoilEvent += (new Alarm()).MakeAlert;   //给匿名对象注册方法   
               heater.BoilEvent += Display.ShowMsg;       //注册静态方法
               heater.BoilWater();   //烧水,会自动调用注册过对象的方法       
                  }   
               } } 
    输出为: Alarm:嘀嘀嘀,水已经 96 度了: Alarm:嘀嘀嘀,水已经 96 度了: Display:水快烧开了,当前温度:96度。 // 省略...
    

     http://blog.csdn.net/jamestaosh/article/details/4372172

  • 相关阅读:
    vue 兄弟组件间传值(bus方式)的坑(重复触发和首次未触发)
    vue 组件间传值(兄弟)(bus方式)
    vue 导出数据到excel
    vue-cli webpack打包后加载资源的路径问题
    vue组件传值之(父子)
    vue组件传值
    thinkphp 5 一些常见问题
    windows 安装 composer
    HTML H5响应式,表格,表单等
    面试
  • 原文地址:https://www.cnblogs.com/fuchongjundream/p/3837396.html
Copyright © 2011-2022 走看看