委托简单示例

刚开始初学C#时,对委托和事件觉得太难懂了,最近看到网上有很多写关于这方面的例子,这里我就mark一下,按自己理解的记下来,权当记个笔记

一,委托

首先,我们定义一个委托,名字就随便取了,自己看的懂就行

public delegate int myDelegate(int x);

为了这个委托,咱写个返回值与参数与之相同的方法

        public static int GetXXX(int x) {
            Console.WriteLine(x * 2);
            return x * 2;
        }

方法很简单,传进来的值乘以2再返回回去,看看委托是怎么调用的

myDelegate md = GetXXX;
            int x = md(3);

通过委托,我们能调用到GetXXX这个方法,有人说,直接调用GetXXX(3)方法不就成了吗,委托的作用在哪里?我们再来一个方法

        public static int GetSSS(int x) {
            Console.WriteLine(x * 11);
            return x * 11;
        }

我们调用的时候,除了调用前面的GetXXX外,还可以调用继续调用GetSSS这个方法,这个就是所谓的多播委托。

            myDelegate md = GetXXX;
            md += GetSSS;
            int x = md(3);

在这里用+=来实现了调用多个方法,同样,也可以用-=去掉某个方法。

委托的另外一个用法是可以把委托当作参数来传递

        //创造一个方法,以委托为参数
        public static int CalculateByD(int x, myDelegate d) {
            return d(x);
        }

            //把方法名GetXXX作为参数传递,之后又传递GetSSS实现这种插件式编程
            CalculateByD(2, GetXXX);
            CalculateByD(2, GetSSS);

另外还有一种泛型委托,如果你对泛型了解,这种理解起来也不难

//泛型委托申明
        public delegate T myDelegate2<T>(T x);

        //泛型委托事件
        public static T Calculate2<T>(T x, myDelegate2<T> c) {
            return c(x);
        }

            //调用事件
            myDelegate2<int> md2 = GetXXX;
            Calculate2(8, md2);

还有一种是匿名委托,也需要了解一下

 //不指定特定方法调用委托
            int y = Calculate2(8, x => x * 9);

Func 和 Action 委托

有了泛型委托,就有了一能适用于任何返回类型和任意参数(类型和合理的个数)的通用委托,Func 和 Action。如下所示(下面的in表示参数,out表示返回结果):

delegate TResult Func <out TResult> ();
delegate TResult Func <in T, out TResult> (T arg);
delegate TResult Func <in T1, in T2, out TResult> (T1 arg1, T2 arg2);
... 一直到 T16

delegate void Action ();
delegate void Action <in T> (T arg);
delegate void Action <in T1, in T2> (T1 arg1, T2 arg2);
... 一直到 T16

有了这样的通用委托,我们上面的Calculator泛型委托就可以删掉了,示例就可以更简洁了:

public static void Calculate<T>(T[] values, Func<T,T> c) {
    for (int i = 0; i < values.Length; i++)
        values[i] = c(values[i]);
}

Func 和 Action 委托,除了ref参数和out参数,基本上能适用于任何泛型委托的场景,非常好用。

原文地址:https://www.cnblogs.com/sky2014/p/4204078.html