C# 委托和事件

    委托:

using System;    
using System.Collections.Generic;    
using System.Linq;    
using System.Text;    
using System.Threading.Tasks;    
  
namespace ConsoleApplication1    
{    
  
    delegate void mydelegate(string name); //声明委托    
  
    class Program2    
    {    
        public void greetpeople(string name, mydelegate dele1)    
        {    
            dele1(name);    
        }    
        public void greeten(string name)    
        {    
            Console.WriteLine("GoodMorning!"+name);    
        }    
        public void greetcn(string name)    
        {    
            Console.WriteLine("早上好!"+name);    
        }    
  
        static void Main(string[] args)    
        {    
        #region     
            Program2 p = new Program2();    
            mydelegate dele1 = new mydelegate(p.greeten);   //实例化委托    
            mydelegate dele2 = new mydelegate(p.greetcn);    
            p.greetpeople("jack", dele1);    
            p.greetpeople("早安", dele2);    
  
            dele2 = dele1;    
            p.greetpeople("早安", dele2);   //委托是可以进行赋值的    
  
            //dele1 += p.greetcn;    
            //p.greetpeople("测试", dele1);    
            mydelegate dele3 = p.greetcn;   //另一种实例化委托的方法    
            p.greetpeople("测试", dele3);    
            //实例化 委托的两种方法 一是: new。。。 而是用=  就像下面的例子一样    
            string str = new string(new char[] { 'a', 'b', 'c' });    
            string str2 = "abc";    
            Console.Write("{0}\n{1}\n", str, str2);    
  
            mydelegate dele4 = p.greetcn;    
            dele4 += p.greeten;    
            dele4 += p.greetcn;     //增加委托方法    
            p.greetpeople("测试1", dele4);    
  
            dele4 -= p.greeten;     //移除委托方法    
            p.greetpeople("测试2", dele4);    
            Console.Read();    
  
         #endregion    
  
  
        }    
    }    
}

 

事件:

using System;   
using System.Collections.Generic;   
using System.Linq;   
using System.Text;   
using System.Threading.Tasks;   
  
namespace ConsoleApplication1   
{   
  
    delegate void mydelegate(string name); //声明委托   
    class Manager   
    {   
        //public mydelegate mydele1;    //在类中 声明一个委托变量使用   
        public event mydelegate evtMydel;   // 事件   
        public void greetpeople(string name)   
        {   
            if (evtMydel != null)   
            {   
                evtMydel(name);   
            }   
  
        }   
    }   
    class Program2   
    {   
  
    public void greeten(string name)   
     {   
            Console.WriteLine("GoodMorning!"+name);   
      }   
        public void greetcn(string name)   
        {   
            Console.WriteLine("早上好!"+name);   
        }   
  
        static void Main(string[] args)   
        {   
            Program2 p = new Program2();   
            Manager m1 = new Manager();   
  
            m1.evtMydel += p.greetcn;   //注册事件 只能用+= 或者-=    
            m1.evtMydel += p.greeten;   
            m1.evtMydel += new mydelegate(p.greeten);   
            m1.greetpeople("张三");   
            Console.Read();   
        }   
    }   
}

Observer的设计模式:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
  
namespace ConsoleApplication1  
{  
  
    delegate void mydelegate1(int temp);  
    class heater  
    {  
         //一个烧水的例子  
        private int temprature;  
  
        //下面的alert show都和温度有关    
        public event mydelegate1 evtMydele;  //声明事件  
        public void boidwater()  
        {  
            for (int i = 0; i < 100; i++)  
            {  
                temprature = i;  
                if (temprature > 95)  
                {  
                    evtMydele(temprature); //   
                }  
            }  
        }  
  
        static void Main(string[] args)  
        {  
  
            heater h = new heater();  
  
            h.evtMydele += new alert().makeAlert;  
            h.evtMydele += new show().showAlert;  
  
            h.boidwater();  
            Console.Read();  
        }  
    }  
  
    class alert  
    {  
        public void makeAlert(int temprature)  
        {  
            Console.WriteLine("滴滴滴,{0}度", temprature);  
        }  
    }  
    class show  
    {  
        public void showAlert(int temprature)  
        {  
            Console.WriteLine("水开了,{0}度", temprature);  
        }  
    }    
}

    理解委托的一种好方式就是把委托当做这样一件事情,它给方法的签名和返回类型指定了名称。就是通过委托可以把一个方法作为一个参数传入另外一个方法使用。

 

posted @ 2013-09-27 11:19  wangxiaowang  阅读(203)  评论(0编辑  收藏  举报