首页 > 编程语言 >C# 用委托有什么好处? 它起什么作用?

C# 用委托有什么好处? 它起什么作用?

时间:2023-04-14 12:55:43浏览次数:35  
标签:调用 委托 C# double 什么 value operation MathsOp

什么是委托  

首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。

如何使用委托  

在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。如下:

1    namespace Vczx.ProCSharp.Exc
2    {
3        delegate double MathsOp( double x );
4        //class defination here
5    }

  这就声明了一个委托

       意义:任何一个返回值为double,且只有一个形参为double的函数,都可以用这个委托来调用。
  注意:

  1. 需求情况而定,一般定义在与类定义平级部分,且用public修饰,便于外部的调用。

  2. 若定义于类的内部,则必须通过调用该类的成员才能取得其委托的引用,在频繁的调用该委托的情况下,就不是很适合。

  实例化:
  首先我们要先有一个满足委托声明的方法,假设一个返回一个数的2倍的方法:

1class MathsOperations
2{
3    public static double MultiplyBy2( double value )
4    {
5        return value * 2;
6    }
7}

  有了这样一个方法,我们就可以实例化一个委托了:

MathsOp operation = new MathsOp( MathsOperations.MultiplyBy2 );

  在实例化一个委托时,要给它一个参数,这个参数就是委托执行的方法,它可以是静态方法,也可以是实例方法(这一点有别于函数指针,函数指针只能调用静态方法),如:

MathsOp operation = new MathsOp( new Class1().Method1 );

在实例化完一个委托之后,就可以用这个委托来调用方法了:

double result = operation( 1.23 );

例子代码:

1   namespace Vczx.ProCSharp.Exc
2   {  
3     delegate double MathsOp( double x );
4     class Start
5     {
6        public class MyDelegate
7        {
8            public static double MultiplyBy2( double x )
9            {
10                return x * 2;
11            }
12        }
13        [STAThread]
14        static void Main(string[] args)
15        {
16            MathsOp operation = new MathsOp( MyDelegate.MultiplyBy2 );
17            double x = 1.23;
18            double result = operation( x );
19            Console.WriteLine( “{0} multiply by 2 is {1}”, x, result ); 
20            Console.Read();
21        }
22     }
23   }

多路广播委托
   前面使用的委托只包含一个方法调用。调用委托的次数与调用方法的次数相同。如果要调用多个方法,就需要多次显示调用这个委托。其实委托也可以包含多个方法,这种委托就是多路广播委托。多路广播委托派生于System.MulticastDelegate,它的Combine方法允许把多个方法调用链接在一起,我们可以通过+=来向委托添加调用方法,也可以用-=删除其中的调用方法。如:

1   namespace Vczx.ProCSharp.Exc
2   {
3      public class MyDelegate
4      {
5         public static void MultiplyBy2( double value )
6        {
7            double result =  value * 2;
8            Console.WriteLine( “Multiplying by 2: {0} gives {1}”, value, result );
9        }
10
11        public static void Squre( double value )
12        {
13            double result = value * value;
14            Console.WriteLine( “Squaring: {0} gives {1}”, value, result );
15        }
16      }
17
18      delegate void MathsOp( double x );
19
20    class Start
21    {
22        [STAThread]
23        static void Main(string[] args)
24        {
25            MathsOp operation = new MathsOp( MyDelegate.MultiplyBy2 );
26            operation += new MathsOp( MyDelegate.Squre );
27            double x = 1.23;
28            operation( x );
29
30            operation -= new MathsOp( MyDelegate.MultiplyBy2 );
31            operation( x );
32            
33            Console.Read();
34         }
35     }
36   }

输出:
Multiplying by 2: 1.23 gives 2.46
Squaring: 1.23 gives 1.5129
Squaring: 1.23 gives 1.5129
  注意,多路广播委托声明时必须返回void,否则返回值不知道应该送回什么地方。对此,我做了一个测试:如果不将委托的声明返回void,则返回值返回的是最后一个链入委托链的方法的返回值,编译不会出错。
为什么要用委托
  使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的

原文:https://www.cnblogs.com/asdyzh/p/9846206.html

标签:调用,委托,C#,double,什么,value,operation,MathsOp
From: https://www.cnblogs.com/ZhongXingxing/p/17317968.html

相关文章

  • docker-compose版本升级
    https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_641.下载安装包根据机器的架构选择具体的版本,更多的请参考官网https://github.com/docker/compose/releases架构下载地址X86https://github.com/docker/compose/releases/download/v2.4......
  • .NET7使用HttpClient实现查询天气预报接口
    朋友做网站需要根据城市展示天气预报,找了一圈没有找到靠谱的接口,今天在中央气象台的官网查询某个城市找到了接口,先用postman试了一下居然可以使用,可以查询某个城市7天的天气预报等信息。但是查询编码是气象台自己的编码,在网上搜索了一下居然有这个编码。本文使用HttpClient方法查......
  • 使用css在元素的前面或者后面添加内容
    :before在元素前面添加内容:after在元素的后面添加内容<!DOCTYPEhtml><html><style>h1:after{content:'前面的内容';}h1:before{content:'后面的内容';}</style><body><h1>***h1内容****</h1></body></html......
  • Cmake 学习记录
    https://cmake.org/documentation/官网有相关的文档,可以以官方的文档进行了解。首先我们先了解一下Cmake的大致使用目的,以前使用过qt,qt有Qmake这个文件,让我大致了解了过程,就是有这么一份文件,配置了相关属性,然后利用工具,将目标工程编译打包。引用下官网的简介:CMakeisanopen-sou......
  • 安全参考和书安 NPM、PYPI、DockerHub 备份
    安全参考2013Dockerdockerpullapachecn0/hackcto-2013dockerrun-tid-p<port>:80apachecn0/hackcto-2013#访问http://localhost:{port}查看文档PYPIpipinstallhackcto-2013hackcto-2013<port>#访问http://localhost:{port}查看文档NPMnpminstall-ghackcto-e......
  • mybatis 连接 ORACLE
     application-common-dev.ymlspring:profiles:include:[common]main:allow-bean-definition-overriding:true#Redis服务器IPredis:host:127.0.0.1#Redis服务器连接端口port:6379#Redis服务器连接密码password:testj......
  • CEH 讲义 NPM、PYPI、DockerHub 备份
    CEHv10ModuleAllInOneDockerdockerpullapachecn0/ceh-v10-mod-allinonedockerrun-tid-p<port>:80apachecn0/ceh-v10-mod-allinone#访问http://localhost:{port}查看文档PYPIpipinstallceh-v10-mod-allinoneceh-v10-mod-allinone<port>#访问http://loca......
  • C++ 学习 第四天
    流程控制练习题1.控制台输入一个数(不多于五位),并将每一位上的数进行输出2.一个球从100米的高度自由落下,每次落地后反跳回原高度的一半;再落下,求他在第10次落地时,共经过了多少米?第十次反弹多高? 3.接上题,球经历多少次反弹后,反弹高度小于1米?4.计算1000内的完数。完数:一个数恰好......
  • Unigraphics NX(UG NX)1957 安装包下载及(UG NX)1957 安装教程
    UG(UnigraphicsNX)是SiemensPLMSoftware公司出品的一个产品工程解决方案,它为用户的产品设计及加工过程提供了数字化造型和验证手段。UnigraphicsNX针对用户的虚拟产品设计和工艺设计的需求,以及满足各种工业化需求,提供了经过实践验证的解决方案。UG同时也是用户指南(userguide)和普......
  • 神策数据入选 IDC 中国客户数据平台 CDP 市场规模及厂商份额报告
    近日,IDC首发中国客户数据平台CDP市场规模及厂商份额报告,明确了CDP产品的功能和使用方式,以便减少购买者的困惑。IDC市场份额报告调研的厂商包括神策数据在内的15家企业,报告显示,市场前5家公司营业额几乎占整个市场的二分之一(47.1%)。报告中,IDC将CDP产品的主要功能分为......