首页 > 代码库 > C#:委托(delegate)

C#:委托(delegate)

一、委托(delegate):是类型安全的方法的引用。在定义委托的时候就确定了该委托所代表的方法的参数签名和返回数据类型,因此委托是类型安全的,这一点是与指针完全不同的。

委托的使用方法与类基本相同,委托的使用分三步:1、委托声明;2、委托实例化;3、委托调用。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; using System.Collections;namespace ConsoleApplication{    class Program    {        delegate string GetString();
        static void  Main(string[] args)        {             string str="HelloWorld";             GetString dlg=new GetString(str.ToString);             Console.WriteLine("str.ToString():".PadRight(20) + str.ToString());             Console.WriteLine("dlg:".PadRight(20) + dlg);             Console.WriteLine("dlg():".PadRight(20) + dlg());                   Console.ReadKey();        }    }}

image

 

关于委托需要注意以下几点:

①方法绑定委托时用的是方法的名称,也就是不能带括号的;

②调用委托必须带括号;

 

二、Action<T> and Func<T> Delegates

这是两种特殊的泛型委托,Action<T> 是没有返回值的委托,可以最少包含0个参数,最多包含16个参数;Func<T> 是带有返回值的委托,其中最后一个类型参数就是返回值的类型,可以最少包含0个参数和一个返回值,最多包含16个参数和一个返回值。

例如:Action<int,string>

        该委托所代表的方法具有两个参数,且第一个参数类型是int类型,第二个参数类型是string类型,没有返回值。

        Func<int,string>

        该委托所代表的方法具有一个参数,且该参数的数值类型是int类型,具有返回值,且返回值类型是string类型。

 

三、多路广播委托(Multicast Delegates)

一个委托实例可以绑定单个方法,也可以绑定多个方法。绑定单个方法的委托称为单路广播委托(Singlecast Delegetes),绑定多个方法的委托称为多路广播委托(Multicast Delegates)。

委托支持+,-,+=,-=运算符,所以两个委托可以直接进行加减运算生成新的多路广播委托。+运算或者+=运算就是将新的方法绑定到委托,-运算或者-=就是将方法与委托解除绑定。多路广播委托绑定的方法的执行顺序与方法绑定到委托的顺序相同,但是在执行过程中,如果某个方法抛出异常,那么之后的方法将都不能被执行。如果你希望在委托绑定的方法执行过程中,即使出现异常,之后的方法也能顺利执行,可以使用GetInvocationList()方法,顺序执行方法,并且捕获异常。例如下面这个例子:

        static void Main()        {            Action d1 = One;            d1 += Two;            Delegate[] delegates = d1.GetInvocationList();            foreach (Action d in delegates)            {                try                {                    d();                }                catch (Exception)                {                    Console.WriteLine("Exception caught");                }            }            Console.ReadKey();        }        static void One()        {            Console.WriteLine("One");            throw new Exception("Error in one");        }        static void Two()        {            Console.WriteLine("Two");        }

image