C#中的委托和事件

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用 If‐Else(Switch)语句,同时使得程序具有更好的可扩展性。
委托具有以下特点:
1、委托类似于C/C++函数指针,但它是类型安全的。
2、委托允许将方法作为参数进行传递。
3、委托可用于定义回调方法。
4、委托可以将多个方法关联在一起。例如,可以对一个事件调用多个方法。
5、委托所指向的方法不需要与委托签名精确匹配。


定义和使用委托:
1、声明委托类型
2、实例化委托对象
3、调用委托方法


事件是类在发生其关注的事情时用来提供通知的一种方式。当发生与某个对象相关的事件时,该类会使用事件将这一对象通知给用户。这种通知即为引发事件,引发事件的对象称为事件源或者发行者。
接收时间的对象称为订阅者,订阅者之所以会接到通知,是因为订阅者订阅了事件源的该事件


事件的创建与使用
1、在事件源类的声明中为事件创建一个委托类型和声明事件
2、在订阅者类中创建时间处理方法
3、订阅事件
4、创建引发事件的方法

5、引发事件


例子:委托

namespace @delegate
{
    delegate double mydelegate(double x, double y); //声明委托类型
    class MyDeClass //声明含有方法的类
    {
        public double add(double x,double y)
        {
            return x + y;
        }
        public double sub(double x,double y)
        {
            return x + y;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyDeClass myDeClass = new MyDeClass();
            mydelegate p = new mydelegate(myDeClass.add);//mydelegate p=myDeClass.add   委托对象关联方法
            Console.WriteLine("1+1={0}", p(1, 1));//调用委托对象
            p = myDeClass.sub;
            Console.WriteLine("2-1={0}", p(2, 1));
        }
    }
}

例子:事件

namespace @event
{
    public class Teacher
    {
        private string name;
        public delegate void delegateType();//声明事件委托类型
        public event delegateType ClassEvent;//声明一个上课事件
        public Teacher(string name)
        {
            this.name = name;
        }
        public void Start()//引发事件的方法
        {
            Console.WriteLine(name + "教师宣布开始上课");
            if (ClassEvent != null)
                ClassEvent();//引发事件的语句
        }
        public class Student
        {
            private string sname;
            public Student (string name)
            {
                this.sname = name;
            }
            public void Listener()
            {
                Console.WriteLine("学生" + sname + "正在认真听课");
            }
            public void Record()
            {
                Console.WriteLine("学生" + sname + "正在做笔记");
            }
        }

        class Program
        {
            static void main(string[] args)
            {
                Teacher t = new Teacher("李明");
                Student s1 = new Student("小明");
                Student s2 = new Student("大明");
                t.ClassEvent += new Teacher.delegateType(s1.Listener);
                t.ClassEvent += new Teacher.delegateType(s2.Record);
                t.Start();//引发事件
            }
        }

    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值