委托是一个可以对方法进行引用的类,它具有一个签名,并且只能对与其签名匹配的方法进行引用。委托是一种特殊的对象类型,其特殊之处在于,以前定义的所有对象都包含数据,而委托包含的只有方法的地址。

实例1:使用委托

 

View Code
using System;
using System.Collections.Generic;
using System.Text;

namespace 练习
{
    public delegate void MyFirstDelegate(string message);
    class MyClass
    {
        public void WriteFirstMessage(string message)
        {
            Console.WriteLine(message);
        }
    }
    class Program
    {
        public static void Main()
        {
            MyClass myClass = new MyClass();
            MyFirstDelegate myFirst = new MyFirstDelegate(myClass.WriteFirstMessage);
            myFirst("委托本省调用了委托");
        }
    }
}

 

结果为:

 

委托在调用方法时不会考虑在什么类型的对象上调用,在调用静态方法时,由于实例化委托是一个对象,所以可以将其作为参数进行传递,也可以将其赋值给属性。

实例2:委托作为参数调用

View Code
using System;
using System.Collections.Generic;
using System.Text;

namespace 练习
{
    public delegate void MyDelegate(int i, int j);
    class MyNewClass
    {
        public static void Sum(int i, int j)
        {
            int sum = i + j;
            Console.WriteLine("和:{0}+{1}={2}", i, j, sum);
        }
        public static void Prosuct(int i, int j)
        {
            int prosuct = i * j;
            Console.WriteLine("积:{0}*{1}={2}", i, j, prosuct);
        }
        public static void MethodDelegate(int i, int j, MyDelegate myDelegate)
        {
            myDelegate(i, j);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyNewClass.MethodDelegate(1010, MyNewClass.Sum);
            MyNewClass.MethodDelegate(1010, MyNewClass.Prosuct);
        }
    }
}

 

其结果为:

 

委托是一个特殊的对象,可以使用“+”运算符将它们分配一个要成为多路广播委托的委托实例。

实例3:多重委托

 

View Code
using System;
using System.Collections.Generic;
using System.Text;

namespace 练习
{
    public delegate void MyDelegate(int i, int j);
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            MyDelegate del = new MyDelegate(p.Method);
            del(1020);
            Console.WriteLine("使用+运算符后,显示的结果");
            del += p.Methodl;
            del(2020);
            Console.WriteLine("使用-运算符后,显示的结果");
            del -= p.Method;
            del(2020);

        }
        void Method(int i, int j)
        {
            Console.WriteLine("求和:{0}+{1}={2}", i, j, i + j);
        }
        void Methodl(int i, int j)
        {
            Console.WriteLine("求积:{0}*{1}={2}", i, j, i * j);
        }
    }
}

 

其结果为:

 

在委托中使用匿名方法就不必创建单独的方法,减少了委托所需要的编码开销,Lambda表达式实际上就是一个匿名函数,他可以使代码更加简洁。

 

事件是建立程序之间的连接的方法和运行过程间的终结操作。事件的处理程序基于委托,如果定义一个事件是没有任何意义的。事件可以分为两部分:事件发生的类和事件接收处理的类。要定义事件就必须先定义委托,用委托定义事件,需要使用event关键字。

实例4:委托与事件

 

View Code
using System;
using System.Collections.Generic;
using System.Text;

namespace 练习
{
    public class TemperatureEventArgs : EventArgs
    {
        private int temperature;

        public int Temperature
        {
            get { return temperature; }
        }
        public TemperatureEventArgs(int _temperature)
        {
            temperature = _temperature;
        }
    }
    public class EventSender
    {
        public delegate void TemperatureEventHander(object sender, TemperatureEventArgs e);
        public event TemperatureEventHander temperaturePress;
        protected virtual void OnTemperaturePess(TemperatureEventArgs e)
        {
            TemperatureEventHander hander = temperaturePress;
            if (hander != null)
            {
                temperaturePress(this, e);
            }
        }
        public void isTemperaturePess(int temperature)
        {
            OnTemperaturePess(new TemperatureEventArgs(temperature));
        }
    }
    public class EventReceive
    {
        public void Press(object sender, TemperatureEventArgs e)
        {
            if (e.Temperature > 80)
            {
                Console.WriteLine("报警器检测温度为{0},马上会发生火灾,请速撤离现场", e.Temperature);
            }
            else if (e.Temperature > 50 && e.Temperature <= 80)
            {
                Console.WriteLine("报警器检测温度太高,可能会发生火灾,请做好撤离现场的准备");
            }
            else
            {
                Console.WriteLine("这里温度正常,请安心工作");
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

            bool trueorfalse = true;
            while (trueorfalse)
            {
                Console.WriteLine("请输入检测器温度,(只能输入数字,否则会出现异常):");
                int temperature = Convert.ToInt32(Console.ReadLine());
                EventSender es = new EventSender();
                EventReceive er = new EventReceive();
                es.temperaturePress += new EventSender.TemperatureEventHander(er.Press);
                es.isTemperaturePess(temperature);
                if (temperature > 200)
                {
                    trueorfalse = false;
                }
                Console.WriteLine("------------------------------------------------------");
                Console.WriteLine("------------------------------------------------------");
            }
            Console.WriteLine("=================================================================");
            Console.WriteLine("由于温度太高报警器已经损坏,程序将在5秒后退出程序");
            Console.WriteLine("请等候......");
            Console.WriteLine("距系统关闭还有5秒");
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("离系统关闭还有4秒");
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("离系统关闭还有3秒");
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("离系统关闭还有2秒");
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("离系统关闭还有1秒");
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("...");

        }
    }
}

其结果为:

posted on 2012-02-15 22:12  风尘西  阅读(112)  评论(0编辑  收藏  举报