Skip to content

Latest commit

 

History

History
105 lines (81 loc) · 2.31 KB

委托.md

File metadata and controls

105 lines (81 loc) · 2.31 KB

委托

[TOC]

Delegate

用于实现事件和回调方法

存有对某个方法的引用的一种引用类型变量;引用可在运行时被改变。

	//声明委托(下面的委托可被用于引用任何 带有一个单一的string参数 的方法,并返回一个int类型变量)
public delegate int Mydele(string s);
    ...
	//创建委托实例
    dele dl1 = new dele()
    //使用委托对象调用方法
    dl1();

例1 将委托当作参数传递

using System;
	//委托声明
delegate int NumberChanger(int n);
namespace DelegateAppl
{
    class TestDelegate
    {
        static int num = 10;
        public static int AddNum(int p)
        {
            num += p;
            return num;
        }
        public static int getNum()
        {
            return num;
        }
        
        static void Main(string[] args)
        {
            /*
            委托实例化(这里将委托指向AddNum方法)
            ***一旦声明了委托类型,委托对象必须用new关键字创建,且与一个特定方法有关
            */
            NumberChanger nc1 = new NumberChanger(Addnum);
            //使用委托对象调用方法
            nc1(25);//-->num=35
            Console.WriteLine("{0}",GetNum());//-->35
        }
    }
}

例2 委托的订阅模式

static void Main(string[] args)
{
    NumberChanger nc = null;
    nc+=AddNum;
}

Event

EventHandler

事件委托,用于处理不具有事件数据的事件的方法,将方法当作参数传递。在c#中基于委托模型,遵守观察者模式,使订阅者能够向提供方注册并接收相关通知。

	//声明一个委托
public delegate void NameEventHandler(object sender,EventArgs e);

	//为委托定义一个事件(event->事件;EventHandler->委托)
public event EventHandler theEventName;

	//创建一个引发事件方法

protected virtual void onEventName(EventArgs e)
{
    EventHandler handler = onEventName;
    if (handler != null)
    {
        handler(this,e);
        //sender=this:事件触发对象是它本身;e:记录了事件传递过来的额外信息
    }
}

	//定义一个事件处理程序方法
static void Solvement(object sender,EventArgs e)
{
    Console.WriteLine("it is reached.");
}

	//为事件附加事件处理程序