C# 委托delegate 和 事件event

本文详细介绍了 C# 中的委托和事件的概念及其应用。从基本的委托使用开始,逐步过渡到事件的封装,并展示了观察者设计模式的应用案例。最后,遵循 .Net Framework 的标准格式进行了规范化的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html

 

 

1、委托:方法名作为其他方法的参数(增强程序扩展性)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EventTest
{
    //定义委托,它定义了可以代表的方法的类型
    public delegate void GreetingDelegate(string name);

    class Program
    {
        private static void EnglishGreeting(string name)
        {
            Console.WriteLine("Morning, " + name);
        }

        private static void ChineseGreeting(string name)
        {
            Console.WriteLine("早上好, " + name);
        }

        //注意此方法,它接受一个GreetingDelegate类型的方法作为参数
        private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
        {
            MakeGreeting(name);
        }

        static void Main(string[] args)
        {
            GreetingDelegate greetingDelegate;
            greetingDelegate = EnglishGreeting; // 先给委托类型的变量赋值
            greetingDelegate += ChineseGreeting;   // 给此委托变量再绑定一个方法
            // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
            GreetPeople("Jimmy Zhang", greetingDelegate);
            Console.ReadKey();
        }
    }
}

 

 

 

 

 

 

2、事件:为了让程序更好的面向对象(有更好的封装性),在利用委托delegate的基础上,来对类进行封装。从委托到事件是一个平滑的过程,程序逐渐有更好的封装性。

过渡阶段的利用事件封装类:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EventTest
{
    //定义委托,它定义了可以代表的方法的类型
    public delegate void GreetingDelegate(string name);
    
    //新建的GreetingManager类
    public class GreetingManager{
        //在GreetingManager类的内部声明greetingDelegate变量
        public event GreetingDelegate greetingDelegate;

        public void GreetPeople(string name)
        {
            if (greetingDelegate != null)
            {     //如果有方法注册委托变量
                greetingDelegate(name);      //通过委托调用方法
            }
        }
    }

    class Program
    {
        private static void EnglishGreeting(string name)
        {
            Console.WriteLine("Morning, " + name);
        }

        private static void ChineseGreeting(string name)
        {
            Console.WriteLine("早上好, " + name);
        }

        static void Main(string[] args)
        {
            GreetingManager gm = new GreetingManager();
            gm.greetingDelegate += EnglishGreeting;
            gm.greetingDelegate += ChineseGreeting;
            gm.GreetPeople("Jimmy Zhang");
            Console.ReadKey();
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

3、Observer 设计模式(订阅者 和 发布者)将上面程序中的 event 单独拿出来:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EventTest
{
    class Mom
    {
        //定义一个委托
        public delegate void delegateRun(string eatWhat);
        //定义一个事件
        public event delegateRun Eat;
        //引发事件的方法
        public void Cook(string eatWhat)
        {
            Eat(eatWhat);//被引发的事件
        }
    }
    class Son
    {
        //定义事件处理方法
        public void Eat(string eatWhat)
        {
            Console.WriteLine("儿子开始吃" + eatWhat);
        }
    }
    class Father
    {
        //定义事件处理方法
        public void Eat(string eatWhat)
        {
            Console.WriteLine("爸爸开始吃" + eatWhat);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Son son = new Son();//实例化事件订阅者儿子
            Father father = new Father();//实例化事件订阅者爸爸
            Mom mom = new Mom();//实例化事件发布者妈妈
            //订阅事件
            mom.Eat += son.Eat;
            mom.Eat += father.Eat;
            //引发事件
            mom.Cook("面");
            Console.ReadKey();
        }
    }
}

 

 

 

 

 

 

4、.Net Framework 中的委托与事件,实际上就是把上面的 Observer 例子进行格式规范的代码整理.

标准参数格式 :public delegate void delegateRun(Object sender, EatSomeEventArgs e);

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EventTest
{
    public class Mom
    {
        public string week = "星期五";

        //定义一个委托
        public delegate void delegateRun(Object sender, EatSomeEventArgs e);
        //定义一个事件
        public event delegateRun Eat;

        public class EatSomeEventArgs : EventArgs
        {
            public readonly string eatWhat;
            public EatSomeEventArgs(string eatWhat)
            {
                this.eatWhat = eatWhat;
            }
        }

        //引发事件的方法
        public void Cook(string eatWhat)
        {
            EatSomeEventArgs e = new EatSomeEventArgs(eatWhat);
            if (Eat != null)
            { // 如果有对象注册
                Eat(this, e);  // 调用所有注册对象的方法
            }
        }
    }

    public class Son
    {
        //定义事件处理方法
        public void Eat(Object sender, Mom.EatSomeEventArgs e)
        {
            Mom mom = (Mom)sender;
            Console.WriteLine("今天是" + mom.week + ", 儿子开始吃" + e.eatWhat);
        }
    }

    public class Father
    {
        //定义事件处理方法
        public void Eat(Object sender, Mom.EatSomeEventArgs e)
        {
            Mom mom = (Mom)sender;
            Console.WriteLine("今天是" + mom.week + ", 爸爸开始吃" + e.eatWhat);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Son son = new Son();//实例化事件订阅者儿子
            Father father = new Father();//实例化事件订阅者爸爸
            Mom mom = new Mom();//实例化事件发布者妈妈
            //订阅事件
            mom.Eat += son.Eat;
            mom.Eat += father.Eat;
            //引发事件
            mom.Cook("面");
            Console.ReadKey();
        }
    }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值