博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中的委托(一)
阅读量:6962 次
发布时间:2019-06-27

本文共 2390 字,大约阅读时间需要 7 分钟。

一、委托

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

二、声明委托

     在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 x1, T x2);MethodInvoker
invoker = new MethodInvoker
(Math.Max);decimal x = invoker(5.20m, 5.21m);Console.WriteLine("x:" + x);Console.ReadLine();MethodInvoker
invoker1 = new MethodInvoker
(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;        }        public int Reduce(int x, int y)        {            return x - y;        }    }

     下面调用这些方法:

delegate int MathOperDelegate(int x, int y);            MathOperDelegate[] operation = {                                            MathOperation.Add,                                           MathOperation.Reduce                                           };            for (int i = 0; i < operation.Length; i++)            {                Console.WriteLine("执行第{0}个委托方法", i);                for (int j = 1; j < 10; j++)                {                    Console.WriteLine("执行结果为:{0}", operation[i](i, j));                    Thread.Sleep(20);                }            }

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

五、为什么要使用委托

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

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

你可能感兴趣的文章
Mysql DOS: 进入Mysql运行文目录 F:\mysql-8.0.13-winx64\bin
查看>>
中小型企业网络构建之路由的简单配置
查看>>
Create an inbound email action
查看>>
oracle教程之DML事务锁定的机制
查看>>
Oracle RMAN 维护(一)--RMAN的维护
查看>>
centos6.6关闭防火墙和selinux
查看>>
JAVA RMI远程方法调用简单实例
查看>>
Citrix桌面虚拟化解决方案介绍
查看>>
WCF学习2
查看>>
python之潜心研究多线程(thread模块) 建议使用threading模块
查看>>
阵列无法解挂导致VCS双机倒换失败
查看>>
ORACLE中用for in 使用cursor
查看>>
Apache - AH00451
查看>>
vim使用技巧
查看>>
nagios+centreon监控构建
查看>>
bootstrap-data-target触发模态弹出窗元素
查看>>
3.第一个MyBatis程序_进化
查看>>
获得ios屏幕上的像素
查看>>
FTPS(下)
查看>>
一个合格的运维工程师应该具有的素质
查看>>