委托是一种引用方法的类型。委托定义出它想要代表的方法的原型,然后它可以和任何符合它所定义的方法的原型相关联。但使用委托时就犹如你在调用一个方法。
委托使你动态的调用方法变成可能。而动态调用方法的意义就在于你可以在任意的地方插入任意的代码
//=========================================================================================
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate_Test
{
/// <summary>
/// 定义一个委托。委托和类一样都是一种类型。只是委托所代表的是一种被定义好原型的方法。
/// </summary>
public delegate void Mydeleg(string msg);
public class Program
{
static void Main(string[] args)
{
//实例化一个委托,也可以看成将一个委托和一个实际想要调用的方法关联起来。
//其中new Mydeleg(GetMessage) 中的GetMessage是定义个方法的实例。你也可以将GetMessage换成GetMessage2
//原因稍后将要进一步的讲解。
Mydeleg methodRef = new Mydeleg(GetMessage);
methodRef("The first message!");
Console.WriteLine("================================================");
//实例化message对象
Message message = new Message();
//设置message对象中的委托类型的成员变量。
message.deleg = new Mydeleg(SendMobilePhone);
//当调用这句的时候实际上在Send方法中附加了底下SendMobilePhone中包含的逻辑(发送方式的逻辑)。
message.Send("I love you");
Console.Read();
}
static void GetMessage(string msgInfo)
{
Console.WriteLine(msgInfo);
}
static void GetMessage2(string msgInfo2)
{
Console.WriteLine(msgInfo2);
}
static void SendMobilePhone(string msg)
{
//表示发送到手机上的逻辑。
Console.WriteLine(msg + " send to MobilePhone");
}
}
//==============================================================================================================
public class TestClass
{
public void GetMessage(string msg)
{
Console.WriteLine(msg);
}
}
//==============================================================================================================
/// <summary>
/// 假设这是一能够发送信息的类。我们可以通过这个类处理管理"信息的各种处理“。
/// </summary>
public class Message
{
public Mydeleg deleg;
public void Send(string message)
{
//表示我在发送信息前对信息做一定的加工。
string result = "you have a message : " + message;
//然后我们需要将这个信息发送。现在我在想一件事情。我要将信息怎么发送?发送到哪?
//发生信息到手机, 那你需要在这里编写发送到手机上的代码逻辑
//发送信息到邮箱, 那你需要在这里编写发送到邮箱上的代码逻辑
//发送信息到QQ上, 那你需要在这里编写发送到QQ上的代码逻辑
//或发送信息到手机并且邮箱、QQ中,又是相应的逻辑。
//我还能列举很多。你现在要解决的问题是如果在不改变这个类的前提下你如何将信息发送到客户需要发送的地方。
//我的想法是,使用委托。
if (deleg != null)
//调用这句你将发现实际是将外部定义的方法引用到这里。使你的方法拥有了在外部定义发送逻辑的能力。
deleg(message);
}
}
}