上一篇介绍了什么是委托和它存在的意义。现在更进一步的介绍一下多点委托。要想学习事件必须要了解多点委托。要知道多点委托的工作方式和委托的工作方式很类似。那就先来看看多点委托。
多点委托其实是指在同一次调用中可以顺序的执行多个方法。为了做到这一点就需要将几个委托做一个“组合”。想想,委托所代表的是一个方法,如果能够将多个委托“组合”在一起不就可以在调用一个委托的时候可以调用多个方法了吗?现在关键就在于如何“组合”。
实际上委托允许使用“+”号来组合多个相同类型的委托。看看下面的例子。
以上多点委托的实现中主要的有几个方面:
1.”组合”的委托必须是类型相同的委托。
2. 组合好的委托会作为一个委托类型出现。所以你可以用 messageHandler = messageHandler + messageHandler2;的形式将两个委托组合成一个委托在赋予另一个委托类型。当然使用 messageHandler += new MessageHandler(GetMessage2);也是一样的,这种语法有点类似于 i += 2;的形式。其他类型能接受,委托为什么不能接收呢?毕竟委托也是一种类型。
需要注意的组合成的多点委托所调用的方法如果定义为可以返回值的话,那么只有最后一个被调用的方法才会真正的返回值,其他的都会被忽略掉。
源代码
多点委托其实是指在同一次调用中可以顺序的执行多个方法。为了做到这一点就需要将几个委托做一个“组合”。想想,委托所代表的是一个方法,如果能够将多个委托“组合”在一起不就可以在调用一个委托的时候可以调用多个方法了吗?现在关键就在于如何“组合”。
实际上委托允许使用“+”号来组合多个相同类型的委托。看看下面的例子。
using System;
using System.Collections.Generic;
using System.Text;
namespace MultiDelegateApp
{
class Program
{
/// <summary>
/// 定义的委托。
/// </summary>
/// <param name="message"></param>
public delegate void MessageHandler(string message);
static void Main(string[] args)
{
//第一种形式
//MessageHandler messageHandler = new MessageHandler(GetMessage);
//MessageHandler messageHandler2 = new MessageHandler(GetMessage2);
//这就是实现了多点委托也叫多路广播。
//messageHandler = messageHandler + messageHandler2;
//第二种形式。
//同时关联到了两个方法。当调用是就会顺序执行。
MessageHandler messageHandler = new MessageHandler(GetMessage);
//下面的语法形式是不是在什么地方见过??
//如果你使用的是vs2005你可以随便为BUTTON建一个事件。然后查看一下其xxxdesign.cs文件。你就能见到
//这就是实现了多点委托也叫多路广播。
messageHandler += new MessageHandler(GetMessage2);
messageHandler("测试信息!");
Console.Read();
}
static void GetMessage(string message)
{
Console.WriteLine(message);
}
static void GetMessage2(string message)
{
Console.WriteLine(message + ": 同时调用的方法。");
}
}
}
using System.Collections.Generic;
using System.Text;
namespace MultiDelegateApp
{
class Program
{
/// <summary>
/// 定义的委托。
/// </summary>
/// <param name="message"></param>
public delegate void MessageHandler(string message);
static void Main(string[] args)
{
//第一种形式
//MessageHandler messageHandler = new MessageHandler(GetMessage);
//MessageHandler messageHandler2 = new MessageHandler(GetMessage2);
//这就是实现了多点委托也叫多路广播。
//messageHandler = messageHandler + messageHandler2;
//第二种形式。
//同时关联到了两个方法。当调用是就会顺序执行。
MessageHandler messageHandler = new MessageHandler(GetMessage);
//下面的语法形式是不是在什么地方见过??
//如果你使用的是vs2005你可以随便为BUTTON建一个事件。然后查看一下其xxxdesign.cs文件。你就能见到
//这就是实现了多点委托也叫多路广播。
messageHandler += new MessageHandler(GetMessage2);
messageHandler("测试信息!");
Console.Read();
}
static void GetMessage(string message)
{
Console.WriteLine(message);
}
static void GetMessage2(string message)
{
Console.WriteLine(message + ": 同时调用的方法。");
}
}
}
以上多点委托的实现中主要的有几个方面:
1.”组合”的委托必须是类型相同的委托。
2. 组合好的委托会作为一个委托类型出现。所以你可以用 messageHandler = messageHandler + messageHandler2;的形式将两个委托组合成一个委托在赋予另一个委托类型。当然使用 messageHandler += new MessageHandler(GetMessage2);也是一样的,这种语法有点类似于 i += 2;的形式。其他类型能接受,委托为什么不能接收呢?毕竟委托也是一种类型。
需要注意的组合成的多点委托所调用的方法如果定义为可以返回值的话,那么只有最后一个被调用的方法才会真正的返回值,其他的都会被忽略掉。
源代码