一.委托的说明

namespace LearningCsharp
{
class Program
{
//定义一个委托,使用delegate加上方法签名
//将委托理解为存储方法的“数组”,方法签名指明了所存储的方法的返回值类型和参数类型,这里返回string,参数为空
//所有符合定义的返回值类型和参数类型的方法都可以存储到“数组”中,不符合的不能存储
delegate string IntToString();
static void Main(string[] args)
{
int a = 10086;
int b = 10010;
int c = 10000;
int d = 10001;
//实例化一个委托,在实例化委托时使用new关键字,括号中的内容不是参数类型,而是在“委托数组”中存储的第一个方法,可以称之为注册一个方法
//IntToString int2String = new IntToString(a.ToString);
            //也可以不使用new关键字,直接将第一个方法存储到一个委托中
            IntToString int2String = a.ToString;
//为“委托数组”添加和删减方法,多个方法的委托称为多播委托
int2String += b.ToString;//添加方法
int2String -= a.ToString;//删减方法,委托中所有方法都被删掉调用时会报错,因此调用委托时可以先判断是否为空再调用,防止调用空委托的情况出现
int2String += c.ToString;
int2String += d.ToString; //调用委托中的方法
//委托中的方法一次性会被全部调用,有返回值的化返回最后存储的方法的返回值,也就是按照存储的顺序进行调用
//调用时需要指明参数,所有方法的参数类型都是一样的,当前委托的参数为空
string s = int2String();
       //这里也可以通过invoke方法调用委托中的方法(不常用)
            string s = int2String.Invoke();
Console.WriteLine(s);
Console.ReadLine();
}
}
}

  返回的是最后注册的d.ToString()方法的返回值

二.委托的使用演示 

namespace LearningCsharp
{
class Program
{
//定义委托
private delegate void PrintString(string s); static void Main(string[] args)
{
//声明委托
PrintString printString = Method1;
//委托可以当作变量进行新的赋值
printString = Method2; //调用方法,将委托当作参数传递
PrintString2Console(printString);
} /// <summary>
/// 将委托作为参数传递,这个方法负责调用委托
/// </summary>
static void PrintString2Console(PrintString ps)
{
ps("我是大帅比");
Console.ReadKey();
}
/// <summary>
/// 两个供委托调用的方法method1和method2
/// </summary>
static void Method1(string s)
{
Console.WriteLine("method1" + s);
}
static void Method2(string s)
{
Console.WriteLine("method2" + s);
}
}
}

  

委托可以作为参数传递给方法,也可以当作参数进行赋值,和基本数据类型相似

三.Action委托

  这是系统内部已经定义好的委托类型,这个委托没有返回值没有参数,但是可以使用泛型是委托具有参数

namespace LearningCsharp
{
class Program
{ static void Main(string[] args)
{
//系统已经定义好的Action委托
Action a = Method1;
//通过泛型指定Action委托的参数
Action<int> aInt = Method2;
//可以为委托指定多个参数,Action最多支持16个参数
Action<int, int> aIntInt = Method3; }
/// <summary>
/// 供委托注册的方法们
/// </summary>
static void Method1()
{
return;
}
static void Method2(int i)
{
return;
}
static void Method3(int i1,int i2)
{
return;
}
}
}

四.Function委托

  这也是系统定义好的委托,但是要求方法必须有返回值,使用泛型指定返回值类型,也可以同时指定参数,泛型中最后一个类型为返回值类型

namespace LearningCsharp
{
class Program
{ static void Main(string[] args)
{
//系统已经定义好的Function委托,无参数,返回值为int类型
Func<int> fInt = Method1;
//通过泛型指定委托的参数,有一个string参数,返回值为int类型
Func<string,int> fStringInt = Method2;
//通过泛型指定委托的参数,有两个string参数,返回值为int类型,参数最多16个
Func<string,string, int> fStringStringInt = Method3; }
/// <summary>
/// 供委托注册的方法
/// </summary>
static int Method1()
{
return 1;
}
static int Method2(string s)
{
return 2;
}
static int Method3(string s1,string s2)
{
return 3;
}
}
}

五.多播委托

  前面已经提到多播委托是委托中能存储不止一个方法,通过+=和-=的方式添加和删除方法。

namespace LearningCsharp
{
class Program
{
//定义委托
delegate void MyDelegate();
static void Main(string[] args)
{
//多播委托
MyDelegate myDel = Method1;
myDel += Method2;
myDel += Method3;
//多播委托按照添加顺序执行,当遇到异常后续的方法都不会执行
myDel(); }
/// <summary>
/// 供委托注册的方法
/// </summary>
static void Method1()
{
Console.WriteLine("m1");
return;
}
static void Method2()
{
Console.WriteLine("m2");
//抛出异常
throw new Exception();
}
static void Method3()
{
Console.WriteLine("m3");
return;
}
}
}

C#委托的进一步学习的更多相关文章

  1. 过实现鹰眼图这个功能来进一步学习MapControl控件

    我们通过实现鹰眼图这个功能来进一步学习MapControl控件.在实现鹰眼图之前,我们需 要接口有更深入的了解. 变主动为被动-出接口(OutBound interface) COM编程类似客户端和服 ...

  2. 对Linux命令进一步学习vim(二)

    今天,进一步学习Linux相关的命令,可能会有重复的地方,但学习本来就是不断重复的过程.故作小记! 1.安装了:vim  ,,,一款Linux爱好者经常用到的ide sudo apt-get inst ...

  3. legend2---开发日志12(vue如何进一步学习)

    legend2---开发日志12(vue如何进一步学习) 一.总结 一句话总结:还是得找教程(比如视频),自己摸索太浪费时间,也容易踩坑和抓不住重点 还是得找教程(比如视频),自己摸索太浪费时间,也容 ...

  4. PHP Loser 说说做前端需要如何进一步学习

    PHP Loser 说说做前端需要如何进一步学习 做前端的,需要如何进一步学习?书籍这个事情贵精不在多,我这里推荐两本即可: <javascript教程 高级程序设计> <CSS权威 ...

  5. abp学习(四)——根据入门教程(aspnetMVC Web API进一步学习)

    Introduction With AspNet MVC Web API EntityFramework and AngularJS 地址:https://aspnetboilerplate.com/ ...

  6. C#委托与事件学习笔记

    委托事件学习笔记 本文是学习委托和事件的笔记,水平有限,如有错漏之处,还望大神不吝赐教. 什么是委托?从字面意思来解释,就是把一个动作交给别人去执行.在实际开发中最常用的就是使一个方法可以当做一个参数 ...

  7. 2020/1/29 PHP代码审计之进一步学习XSS【持续更新】

    0x00 上午学习了XSS漏洞,中午吃饭想了想,还是思考的太浅层了,这种老生常谈的东西对于现在的我意义不大.现在我需要的是思考.于是就有了这个随笔.在本文中,我会持续更新一些XSS的深入思考,payl ...

  8. 在Arrays.asList()引发的问题中进一步学习集合与泛型等内容

    前言 最近在网上看到一个问题,情况类似如下(记为问题1): public class Demo { public static void main(String[] args) { System.ou ...

  9. 关于C#委托的一些学习笔记

    1.什么是委托就是把方法作为参数传给另一个方法.委托说指向的函数,必须和函数具有相同的签名(返回值和参数类型) Public delegate void DelSayHi(string name); ...

随机推荐

  1. Linux sed 命令总结

    一.sed格式命令 sed 命令行格式为:sed [选项] 'command' 输入文本 二.sed命令的选项 sed [选项] [动作] 选项与参数: -n :使用安静(silent)模式.在一般 ...

  2. centos7.5安装Oracle11gR2

    centos7.5安装Oracle11gR2 说明:由于上一台旧的笔记本电脑(CPU:i5-7200,内存:8G,硬盘:128SSD+1T机械)卸任,所以打算在家搭建一个个人服务器(主要是换不锈钢盆不 ...

  3. 20210105 - python自动化办公简介

    新的一年开始了, 计划每周至少更新三篇博客. 人生苦短,如果不做改变,人生很快会过去!2021年寻求改变,加油! python自动化办公: 1.相关工具与环境的安装概要: 需要用到python(一种开 ...

  4. Spring 抽象的缓存包 spring-cache

    项目实战 用户信息查询接口中,使用@Cacheable注解  绑定相关信息接口中,使用@CachePut更新用户信息到缓存 更新用户信息接口中,使用@CacheEvict删除缓存信息 使用步骤 添加依 ...

  5. 【函数分享】每日PHP函数分享(2021-1-9)

    implode() 将一个一维数组的值转化为字符串. string implode ( string $glue , array $pieces ) 参数描述 glue     默认为空的字符串. p ...

  6. DM TDD使用小结

    1.搭建流程 1.1 ss初始化及启动 --->1节点: cd /dm/bin ./dmdssinit path=/dm/data inst=ss1 port=35300 REGION_SIZE ...

  7. 【JDBC核心】commons-dbutils

    commons-dbutils 简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC 工具类库,它是对 JDBC 的简单封装,学习成本极低,并且使用 commons-d ...

  8. SpringCloud Alibaba Nacos服务注册与配置管理

    Nacos SpringCloud Alibaba Nacos是一个狗抑郁构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos:Dynamic Naming and Configurat ...

  9. LeetCode-151-中等-翻转字符串里面的单词

    问题描述 给定一个字符串,逐个翻转字符串中的每个单词. 说明: 无空格字符构成一个 单词 . 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括. 如果两个单词间有多余的空格,将反转 ...

  10. 跟我一起学Redis之加个哨兵让主从复制更加高可用

    前言 主从复制的实现在上一篇已经分享过,虽然主从复制本身的确让读写分离更加高效,但是对于整体高可用存在很大的劣势:当主节点宕机了之后还需要人为重新进行主从关系配置:这不是开玩笑嘛,这样人为干预,故障恢 ...