正式进入C#的世界——委托

委托(delegate)1、可以认为是这样的对象,它包含具有相同签名和返回值类型的有序方法列表。2、可以理解为函数的一个包装,它使得C#中的函数可以作为参数来被传递。

委托的定义和方法的定义类似,只是在定义的前面多一个delegate关键字。

public delegate void MyDelegate( int para1, string para2);//包装public          void MyMethod(int a, string b);   //返回类型相同,参数个数,顺序和类型相同。 
  • 方法的签名 必须 与 委托 一致,方法签名包括参数的个数、类型和顺序。
  • 方法的返回类型要和 委托 一致,注意,方法的返回类型不属于方法签名的一部分。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 作业1
    {
        class Program
        {
            //1.使用delegate定义一个委托类型
            delegate void MyDelegate(int para1, int para2);
            static void Main(string[] args)
            {
    
                //2.声明委托变量d
                MyDelegate d;
    
                //3.实例化委托类型,传递的方法也可以为静态方法,这里传递的是实例方法
                d=new MyDelegate(new Program().Add);
    
                //4.委托类型作为参数传递给另一个方法
                MyMethod(d);
                Console.ReadKey();
            }
    
            //该方法的定义必须与委托定义相同,即返回类型为void,两个int类型的参数
            void Add(int para1,int para2)
            {
                int sum = para1 + para2;
                Console.WriteLine("两个值的和为:"+sum);
            }
    
            //方法的参数是委托类型
            private static void MyMethod(MyDelegate mydelegate)
            {
                //5. 在方法中调用委托
                mydelegate(1, 2);
            }
    
        }
    }

    委拖链

委托链其实就是委托类型,只是委托链把多个委托链接在一起而已,也就是说,我们把链接了多个方法的委托称为委托链或多路广播委托。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace 作业1
 8 {
 9     class Program
10     {
11         public delegate void DelegateTest();
12         static void Main(string[] args)
13         {
14
15             //用静态方法实例化委托
16             DelegateTest dtDelegate = new DelegateTest(Program.method1);
17
18             //用实例方法
19             DelegateTest deDelegate1 = new DelegateTest(new Program().method2);
20
21             //定义一个委托对象,一开始指定为空,即不代表什么方法
22             DelegateTest delegateChain = null;
23
24             //使用+符号链接委拖 -符号移除委托
25             delegateChain += dtDelegate;
26             delegateChain += deDelegate1;
27             delegateChain += deDelegate1;
28             delegateChain += dtDelegate;
29             delegateChain-= dtDelegate;
30             delegateChain();
31
32             Console.ReadKey();
33         }
34
35
36         //静态方法
37         private static void method1()
38         {
39             Console.WriteLine("这里是静态方法");
40         }
41
42         private void method2()
43         {
44             Console.WriteLine("这里是实例方法");
45         }
46     }
47 }
时间: 2024-08-08 21:15:09

正式进入C#的世界——委托的相关文章

2019 SAIL启航:“世界人工智能创新大赛(AIWIN)”今在沪启动

4月25日,2019世界人工智能创新大赛(AIWIN)在上海市长阳创谷正式启动,作为世界人工智能大会重要奖项的卓越人工智能引领奖SAIL(Super AI Leader)评选活动也同步启动.作为上海市人工智能发展生态营造的重要活动,本次大赛以"启迪智能,启航未来"为主题,以营造人工智能创新氛围,加速人工智能人才集聚,挖掘人工智能优秀项目,扩大人工智能国际影响为导向,通过设置不同主题的赛道,招募全球人工智能技术人才与团队,为上海打造人工智能高地提供有力平台支撑.市经济和信息化委员会总工程

跟我一起学WCF(3)——利用Web Services开发分布式应用

一.引言 在前面文章中分别介绍了MSMQ和.NET Remoting技术,今天继续分享.NET 平台下另一种分布式技术——Web Services 二.Web Services 详细介绍 2.1 Web Services 概述 Web Services是支持客户端与服务器通过网络互操作的一种软件系统,是一组可以通过网络调用的应用程序API.在Web Services中主要到SOAP/UDDI/WSDL这三个核心概念,下面分别介绍下这三个概念的定义. SOAP:SOAP(Simple Object

lua中的面向对象编程

简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 上述代码会输出tb1 ~= tb2.说明两个具有相同值得对象是两个不同的对象,同时在Lua中table是引用类型的.我在<Lua中的模块与包>中也总结了,我们是基于table来实现的模块,在table中可以定义函数,也就是说,每个table对象都可以拥有其自己的操作.看一段代码: 上面的代码创建了一个新函数,并将该函数存入Account对象的withDraw字段中,然后我们就可以调用该函数了.不过,在函数中使

Lua面向对象编程

Lua中的table就是一种对象,看以下一段简单的代码: 1 local tb1 = {a = 1, b = 2} 2 local tb2 = {a = 1, b = 2} 3 local tb3 = tb1 4 5 if tb1 == tb2 then 6 print("tb1 == tb2") 7 else 8 print("tb1 ~= tb2") 9 end 10 11 tb3.a = 3 12 print(tb1.a) 上述代码会输出tb1 ~= tb2.

冲上云霄 之三 初窥中国版Azure

前面两篇介绍了云计算的基本概念和微软为公有云.私有云提供的产品及服务.特别对中国版Azure(约定:如果后续内容没有特别指出,提到Azure均指中国版Azure)的功能和服务做了讲述.接下来,将正式进入Azure的世界,去撩起她那绚丽的面纱,一窥其真容. 中国版Azure和国际版Azure一样,都是通过管理门户来进行管理的.在<初识云>结尾时已经介绍了她的试用申请方法.现在直接来看看如果使用这一管理门户. 一.登录管理门户 在浏览器中,通过以下URL可以直接访问到Azure管理门户登录页面.这

Lua语言基础汇总(12)-- Lua中的面向对象编程

简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 1 2 3 4 5 6 7 8 9 10 11 12 local tb1 = {a = 1, b = 2} local tb2 = {a = 1, b = 2} local tb3 = tb1   if tb1 == tb2 then      print("tb1 == tb2") else      print("tb1 ~= tb2") end   tb3.a = 3 pri

[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第十三章 协议

13.1 协议 正式协议:包含了方法和属性的有名称列表. 注意: 采用协议后,类就要实现该协议的所有方法. 通常情况下,一个协议只有少数几个需要实现的方法. 在协议中,不会引用新的实例变量. 13.11 声明协议 NSCopying 协议 @protocol NSCopying - (id) copyWithZone: (NSZone *) zone; @end //如果采用了NSCopying协议,你的对象将会知道如何创建自身的副本 继承父协议 @protocol MySuperDuberPr

(三)PHP网页架站

目前,Windows下已经有集成的PHP网页架站工具,例如:AppServ.WampServer.这些软件将Apache.PHP.MySQL.phpMyAdmin集成到一起,极大地方便了开发者架站.但是,这些集成的架站工具通常不是最新的架站软件集合,如Apache最新为2.4 10,而集成工具中则为2.2,我们无法仅对Apache升级.另外,作为一个想做web开发的人,不会自己独立架站,是不是很没面子??长话短说,进入正题,下面对自定义架站过程予以总结: 通常,架站软件是放到一个文件下的,在这里

.com 域名三十年回顾:从 1 到 1 亿个,一部互联网的变迁史

摘要第一个 .com 域名诞生的五年后,互联网才成为一个世界范围内的事件.也就是你早就听说过的,在1993 年,麻省理工学院教授蒂姆·伯纳斯·李,利用超文本连接,为互联网做了一个方便提取的目录,万维网诞生了. .com,从第 1 个到第 1 亿个. 尽管你在 .com 后面按下回车键的动作已经跟吃饭喝水一样平常,你可能并没有想到过这事儿在世界上存在了 30 年.1985 年 3 月 15 日,世界上第一个 .com 顶级域名诞生,麻省理工学院人工智能实验室的电脑公司 Symbolics 注册了第