我的博客

asp.net 自学笔记及开发过程中的经验、技巧、摘录
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

事件,委托 实例

Posted on 2008-07-18 17:16  Net_Learner  阅读(628)  评论(0编辑  收藏  举报

委托
使用委托的步骤:
1.定义委托
2.实例化委托
3.使用委托

[访问修饰符] delegate 返回类型 委托名();

    class Program
    {
            //定义委托Call
            public delegate int Call(int num1,int num2);

        class Math
        {
            public int Multiply(int num1, int num2)
            {
                               //语句;
            }
            public int Divide(int num1, int num2)
            {
                               //语句;
            }
        }
        class TestDelegates
        {
            static void Main()
            {
                Call objCall;
                Math objMath = new Math();
                //实例化委托Call
                objCall = new Call(objMath.Multiply);
            }
        }
    }


调用委托
调用委托意味着使用委托对方法进行实例化.

    class Delegates
    {
        //委托定义
        public delegate int Call(int num1,int num2);
        class Math
        {
            //乘法方法
            public int Multiply(int num1,int num2)
            {
                return num1*num2;
            }
            //除法方法
            public int Divide(int num1, int num2)
            {
                return num1 / num2;
            }
        }
        class TestDelegates
        {
            static void Main()
            {
                //存储结果的变量
                int result;
                //委托的对象
                Call objCall;
                //Math类的对象
                Math objMath = new Math();
                //实例化委托
                objCall = new Call(objMath.Multiply);
                //调用委托
                result = objCall(5, 3);
                Console.WriteLine(result);
            }
        }
    }

控制台输出:
15

定义事件
[访问修饰符] event 委托名 事件名;

定义事件时,发行者首先定义委托,然后根据该委托定义事件.
//定义一个委托
public delegate void delegateMe();
//定义一个事件
private event delegateMe eventMe;
为什么要用委托来定义一个事件?因为这里用委托限定了事件引发函数的类型,即函数的参数个数,类型以及函数的返回值类型.

订阅事件只是添加了一个委托,事件引发时该委托将调用一个方法.
//objA方法订阅了事件eventMe
eventMe += new delegateMe(objA.Method);

引发事件
对特定条件进行检查,如果指定的条件为真,则引发事件eventMe
if(true)
{
    //引发eventMe事件
    eventMe();
}

综合例子:

 class Student
    {
        //定义委托
        public delegate void DelegateRegisterFinish();
        //通过委托定义事件
        public event DelegateRegisterFinish RegisterFinish;
        private string _name;
        public Student(string name)
        {
            _name = name;
        }
        public void Register()
        {
            Console.WriteLine("学生{0}进行注册",_name);
            if (RegisterFinish != null)
            {
                //引发事件
                RegisterFinish();
            }
        }
    }
    class Registe
    {
        static void Main()
        {
            Console.WriteLine("输入注册学生的姓名:");
            string studentName = Console.ReadLine();
            Student student = new Student(studentName);        
            //订阅Student类的RegisterFinish事件
            student.RegisterFinish += new Student.DelegateRegisterFinish(student_Regis);
            student.Register();
        }
        private static void student_Regis()
        {
            Console.WriteLine("注册成功");
        }
    }

控制台输出:
输入注册学生的姓名:
Tom
学生Tom进行注册
注册成功

练习:

创建事件ZeroEntered,接受用户输入的两个数.如果用户输入数字0,则应该引发该事件并调用方法Disp来

显示"不允许以零为除数",如果输入数字大于0,则对数字进行除法计算并显示结果.

    class Test
    {
        //定义一个委托
        public delegate void delegateMe();
        //定义一个事件
        public event delegateMe ZeroEntered;
        public void Register(int num1,int num2)
        {
            if (num2 == 0)
            {
                //引发事件
                ZeroEntered();
            }
            else
            {
                Console.WriteLine(num1/num2);
            }

        }

    }
    class Tests
    {
        static void Main()
        {
            Console.WriteLine("输入被除数");
            int num = int.Parse(Console.ReadLine());
             Console.WriteLine("输入除数");
            int num2 = int.Parse(Console.ReadLine());
            Test obj = new Test();        
            obj.ZeroEntered+=new Test.delegateMe(Disp);
            obj.Register(num, num2);
        }
        public static void Disp()
        {
            Console.WriteLine("不允许以零为除数");
        }
    }

第一次
控制台输出:
输入被除数
10
输入除数
5
2

第二次
控制台输出:
输入被除数
10
输入除数
0
不允许以零为除数