委托_多播委托<16/9/2017>
简单演示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 委托
{
class Program
{
static void T1()
{
Console.WriteLine("T1");
}
static void T2()
{
Console.WriteLine("T2");
}
static void Main(string[] args)
{
//多播委托,引用多个方法
Action a = T1;
a += T2;
a();
Console.ReadKey();
}
}
}
可以看到两个方法都被执行了
多播委托的特性:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 委托
{
class Program
{
static void T1()
{
Console.WriteLine("T1");
}
static void T2()
{
Console.WriteLine("T2");
}
static void Main(string[] args)
{
//1.多播委托,引用多个方法,委托指向了多个方法
//2.按照添加顺序来执行
//3.多播委托只能得到最后一个方法的结果
//4.多播委托的返回类型一般声明为void
//5.多播委托包含一个逐个调用的委托集合,如果通过委托调用其中一个方法抛出异常,整个迭代就会停止
//(一旦执行了异常方法,直接终止调用)
Action a = T1;
a += T2;
a -= T1;
if (a != null)
{ a(); }//没有指向任何方法,调用会出现异常null
Console.ReadKey();
}
}
}
取得多播委托中取得所有方法的委托
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 委托
{
class Program
{
static void T1()
{
Console.WriteLine("T1");
}
static void T2()
{
Console.WriteLine("T2");
}
static void Main(string[] args)
{
Action a = T1;
a += T2;
//先遍历委托
Delegate[] delegates = a.GetInvocationList();
//遍历完成后单个执行委托
foreach (Delegate i in delegates)
{
i.DynamicInvoke();
}
Console.ReadKey();
}
}
}