zoukankan      html  css  js  c++  java
  • 委托简单示例

    刚开始初学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参数,基本上能适用于任何泛型委托的场景,非常好用。

  • 相关阅读:
    采用重写tostring方法使ComboBox显示对象属性
    JavaScript中正则表达式test()、exec()、match() 方法
    高级软件工程实践总结作业
    用户使用调查报告
    Beta阶段置顶集合
    Beta冲刺阶段总结随笔
    Beta冲刺Day7
    Beta冲刺Day6
    Beta冲刺Day5
    Beta冲刺Day4
  • 原文地址:https://www.cnblogs.com/sky2014/p/4204078.html
Copyright © 2011-2022 走看看