zoukankan      html  css  js  c++  java
  • C#中的委托(一)

    https://www.cnblogs.com/ricky-wang/p/6921641.html

    一、委托

          把方法作为参数传给其他方法;

    二、声明委托

         在C#中使用一个类时,分两个阶段。首先,需要去定义一个类,然后实例化类的一个对象(只需要静态方法除外)。 使用委托也需要经过这2个步骤,首先必须定义要使用的委托,对于委托,定义它就是告诉编译器这种类型的委托表示哪种类型的方法。然后,必须创建该委托的一个或多个实例。编译器在后台将创建表示该委托的一个类。定义委托的语法如下:

    delegate void IntMethodInvoker(int x);

         在这个示例中,定义了一个委托IntMethodInvoker,并指定该委托的每个实例都可以包含一个方法的引用,该方法带有一个int参数,并返回void。理解委托的一个要点就是他们的类型安全性非常高。在定义委托时,必须给出它所表示的方法的签名和返回类型等全部细节;

         假设要定义一个委托,该委托表示的方法包含有两个decimal型的参数,返回类型为decimal;

    delegate decimal MethodInvoker(decimal x, decimal y);

    三、使用委托

          首先定义好委托,然后创建该委托的一个或多个实例;假设我要使用上面MethodInvoker的话,代码如下:

    MethodInvoker invoker = new MethodInvoker(Math.Max);
    decimal x = invoker(5.20m, 5.21m);
    Console.WriteLine("x:" + x);

         在这里我们把Math.Max(decimal val1,decimal val2) 返回传给了委托;得出2个值中最大一个值,运行上面代码可以得到如下结果:

        如果MethodInvoker委托,只是想得到2个参数进行一系列操作后返回一个结果。上面的结构就不能满足这个需求,因为已经限制好了参数类型和返回类型。说到这,对泛型熟悉的朋友就应该知道,如果采用泛型去声明该委托,就可以解决这个问题了。我们就接着上面的代码改造:

    复制代码
    delegate T MethodInvoker<T>(T x1, T x2);
    

    MethodInvoker<decimal> invoker = new MethodInvoker<decimal>(Math.Max);
    decimal x = invoker(5.20m, 5.21m);
    Console.WriteLine(
    "x:" + x);
    Console.ReadLine();
    MethodInvoker
    <double> invoker1 = new MethodInvoker<double>(Math.Pow);
    double x1 = invoker1(10, 3);
    Console.WriteLine(
    "x:" + x1);

    复制代码

    输出结果:

     

        参与泛型的方式声明委托后就可以满足输入2个参数进行操作后得到一个返回结果;

    四、简单委托示例

         定义一个简单的数据操作类MathOperation,添加2个静态方法Add(int,int)、Reduce(int,int),两个方法都返回int类型,代码如下:

    复制代码
        public class MathOperation
        {
            public int Add(int x, int y)
            {
                return x + y;
            }
    
        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Reduce(<span style="color: rgba(0, 0, 255, 1)">int</span> x, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> y)
        {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> x -<span style="color: rgba(0, 0, 0, 1)"> y;
        }
    }</span></pre>
    
    复制代码

         下面调用这些方法:

    复制代码
              delegate int MathOperDelegate(int x, int y);
    
            MathOperDelegate[] operation </span>=<span style="color: rgba(0, 0, 0, 1)"> { 
                                           MathOperation.Add,
                                           MathOperation.Reduce
                                           };
    
            </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; operation.Length; i++<span style="color: rgba(0, 0, 0, 1)">)
            {
                Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">执行第{0}个委托方法</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, i);
                </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> j = <span style="color: rgba(128, 0, 128, 1)">1</span>; j &lt; <span style="color: rgba(128, 0, 128, 1)">10</span>; j++<span style="color: rgba(0, 0, 0, 1)">)
                {
                    Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">执行结果为:{0}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, operation[i](i, j));
                    Thread.Sleep(</span><span style="color: rgba(128, 0, 128, 1)">20</span><span style="color: rgba(0, 0, 0, 1)">);
                }
            }</span></pre>
    
    复制代码

         在这段代码中,实例化了一个MethodDelegate委托的数组,然后遍历这个数组,然后执行其中的不同返回,得到的结果如下:

    五、为什么要使用委托

          使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。

  • 相关阅读:
    Ruby on rails3新手谈(1):Ruby on rails环境搭建
    更灵活,更易维护的WebHandler之通用webHandler编码方案(2)
    .Net Remoting之windows服务部署
    Ruby on rails3新手谈(2):简单的例子helloworld
    分组取最新记录的SQL
    验证日期的Javascript
    使用Javascript创建遮罩层并模拟Alert、Confirm对话框
    取得当前鼠标的X,Y坐标,及相关属性的介绍
    B/S结构系统中使用Session遇到的问题
    IE与FireFox的兼容性问题
  • 原文地址:https://www.cnblogs.com/sunny3158/p/14701565.html
Copyright © 2011-2022 走看看