天天看点

C#基础-委托与事件

官方描述:

委托(delegate)是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。 

委托也叫代理,把事情交给别人去办理。

声明委托模板

<访问修饰符> delegate 返回类型 委托名称(变量类型 变量名);
           

C#中如果将一个方法委托给一个对象,这个对象就可以全权代理这个方法的执行。

举例:

//声明委托
public delegate void Del(string message);

//创建委托的一个方法
public static void DelegateMethod(string message)
{
    Console.WriteLine(message);
}

// 实例化委托
Del handler = DelegateMethod;

// 执行委托
handler("Hello World");
           

事件

事件基于委托,为委托提供了一种发布订阅机制。

事件是委托的一个实例;

事件需要在类中声明;

需要将要做的事情的方法,绑定到事件中,然后响应事件,客户就可以一起执行完成方法;

namespace ConsoleApp1
{
    public  class Program
    {

        static void Main(string[] args)
        {
            Incrementer incrementer = new Incrementer();//实例化

            incrementer.CountedADozen += ShowSomeThing;//订阅事件
            Dozens dozens = new Dozens(incrementer);

            incrementer.DoEvent();//执行事件
            Console.ReadLine();
        }

        public static void ShowSomeThing()
        {
            Console.WriteLine($"excute showSomeThing");
        }

    }

    #region 事件发布
    public delegate void Handler();

    public class Incrementer
    {
        public event Handler CountedADozen;//实例化委托,就是事件吗?

        public void DoEvent()
        {
            for (int i = 1; i < 50; i++)
            {
                if (i % 12 == 0 && CountedADozen != null)
                {
                    CountedADozen.Invoke();//执行事件
                }
            }
        }
    }
    #endregion

    #region 订阅事件
    public class Dozens
    {
        public Dozens(Incrementer incrementer)
        {
            incrementer.CountedADozen += IncrementDozenCount;
        }

        public void IncrementDozenCount()
        {
            Console.WriteLine($"Dozens");
        }
    } 
    #endregion


}