a、委托是什么
1. 委托的定义:
使用delegate关键字定义委托(注:委托没有方法体,类似于接口中的方法)。委托定义前,需要明确的问题:

  • 是委托将要绑定的方法;
  • 是委托的形参类型、形参个数以及返回值,必须与将要绑定的方法的形参类型、形参个数及返回值一致。

2.相关概念:
委托涉及的相关概念有函数指针 、类型安全性、事件、Lambda表达式等。

  • 函数指针:在C++中,指针的一个类别,主要指向函数(变量指针,主要指向变量地址),可以吧C#中的委托理解为函数指针。
  • 类型安全性:在C++中,我们都知道指针是类型不安全的(返回值、返回类型以及什么时候返回,这些都是未知的),然而委托是类型安全的;
  • 事件:可以把事件理解为一种特殊的委托;
  • Lambda表达式:委托与Lambda表达式相结合,可以实现高效编程、它与jQuery中“使用较少的代码做更多的事”类似。委托与Lambda、Linq相结合,使较短的代码实现比较复杂的功能。

3.委托的组成:
主要分为两部分去实现:

  • 声明委托:使用delegate关键字声明;
  • 绑定方法(注册方法):绑定具体方法、传递方法名称。

4.委托的分类:

  • 单播委托:顾名思义只能绑定一个方法;
  • 多播委托:则可以绑定多个方法。

5.委托的操作:

  • 绑定方法;
  • 解绑方法。

b、委托能解决那些问题呢?

  1. 避免核心方法中存在太多的if…else…语句或者switch开关语句;
  2. 满足程序设计的OCP(开-闭原则)原则;
  3. 使得程序具有扩展性;
  4. 绑定事件;
  5. 结合Lambda表达式,简化代码,高效编程;
  6. 实现程序的松耦合(解耦),这种情况在事件(event)中体现的比较明显。

c、委托的使用:
1. 定义委托:

public delegate  委托返回的类型  委托名(形参)

2.使用委托,举例:

        static void Main(string[] args){Console.WriteLine("----------请输入用户名:----------");string userName = Console.ReadLine();Console.WriteLine("----------请输入语言----------");string language = Console.ReadLine();GetPeopleGreetings getGreeetings = new GetPeopleGreetings();if (language.Equals("Chinese"))Console.WriteLine(GetGreetingsStrings(userName, getGreeetings.GetChineseGreeting));else if (language.Equals("English"))Console.WriteLine(GetGreetingsStrings(userName, getGreeetings.GetEnglishGreeting));elseConsole.WriteLine(GetGreetingsStrings(userName, getGreeetings.GetOtherGreeting));Console.ReadKey();}/// <summary>/// 一个参数的委托/// </summary>/// <param name="userName"></param>/// <param name="getGreetingsByDelegate"></param>/// <returns></returns>public static string GetGreetingsStrings(string userName, GetGreetingsByDelegate getGreetingsByDelegate){return getGreetingsByDelegate(userName);}

定义委托:

  public delegate string GetGreetingsByDelegate(string userName);

定义给委托绑定的方法:

    public class GetPeopleGreetings{public string GetGreetingsByUserNameAndLanguage(string userName, string Language){return $"你好!{userName},先生,您说的是“{Language}”语言吗?";}public string GetChineseGreeting(string userName){return "您好!" + userName + "先生。";}public string GetEnglishGreeting(string userName){return "Hello," + userName + "!";}public string GetOtherGreeting(string userName){return "sorry!当前系统只支持汉语和英语。";}}

3.绑定方法:

  • 单播绑定:绑定单个方法,将单个方法名字传给委托即可(上面的例子就是单播绑定的实现);
Console.WriteLine("----------请输入用户名:----------");
string userName = Console.ReadLine();
Console.WriteLine("----------请输入语言----------");
string language = Console.ReadLine();
GetPeopleGreetings getGreeetings = new GetPeopleGreetings();
GetGreetingsByDelegate gg;
if (language.Equals("Chinese"))
{
gg = getGreeetings.GetChineseGreeting;
Console.WriteLine(gg(userName));
}
else if (language.Equals("English"))
{
gg = getGreeetings.GetEnglishGreeting;
Console.WriteLine(gg(userName));
}
else
{
gg = getGreeetings.GetOtherGreeting;
Console.WriteLine(gg(userName));
}
Console.ReadKey();
  • 多播绑定(绑定多个方法,注意:绑定多个方法时,委托范围类型必须为void类型,否则只返回最后一个绑定的值。),如下:
static void Main(string[] args){GetPeopleGreetings greeetings = new GetPeopleGreetings();GetGreetingStrings gg;gg = greeetings.ChineseGreetings;gg += greeetings.EnglishGreetings;gg("谢文东!");Console.ReadKey();}

定义绑定多个方法的委托:

public delegate void GetGreetingStrings(string userName);

定义给委托绑定的方法:

public class GetPeopleGreetings
{public void ChineseGreetings(string userName){Console.WriteLine($"你好!{userName},先生。");}public void EnglishGreetings(string userName){Console.WriteLine($"Hello,{userName}!");}
}

总结,绑定多个方法时,用“+=”绑定。
4.委托解绑:
当然解载绑定的方法,我们用的是“-=”解绑的。

static void Main(string[] args){GetPeopleGreetings greeetings = new GetPeopleGreetings();GetGreetingStrings gg;gg = greeetings.ChineseGreetings;gg += greeetings.EnglishGreetings;gg -= greeetings.ChineseGreetings;gg("谢文东!");Console.ReadKey();}

完。
此笔记参考资料来源于:https://www.cnblogs.com/wangjiming/p/8300103.html博客信息。

在那一刻,我意识到,我必须选择,要么对一切屈服,得过且过地生活,要么就得努力,争取过上梦想的生活。

C# 委托学习笔记(一)相关推荐

  1. IOS之学习笔记十五(协议和委托的使用)

    1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...

  2. C#学习笔记——委托机制

    什么是委托?委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成.委托是一个类,当你对它实例化时,要提供一个引用函数,将其作为它构造函数的参数.委托具有以下特点:1)委托类似于 C++ ...

  3. Mcad学习笔记之委托再理解(delegate的构造器,MulticastDelegate,BeginInvoke,EndInvoke,Invoke4个方法的探讨)...

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  4. 委托(C#入门详解学习笔记)

    委托(C#入门详解学习笔记) 几个概念 什么是委托 委托的声明(自定义委托) 委托的常规使用 通用泛型委托类型的简单使用(Func和Action) 委托的高级使用 多播委托 委托的异步调用 使用接口取 ...

  5. C#学习笔记:利用System,EventArgs实现委托,响应键盘按键事件

    参考书目:C#6.0学习笔记--从第一行C#代码到第一个项目设计(作者周家安)P96 学习目的:掌握System,EventArgs实现委托的方法,响应键盘按键事件.捕捉用户的键盘输入,然后触发Key ...

  6. 【vn.py学习笔记(六)】vn.py constant源码阅读、委托生命周期

    [vn.py学习笔记(六)]vn.py constant源码阅读.委托生命周期 写在前面 1 constant 1.1 Direction 1.2 Offset 1.3 Status 1.4 Prod ...

  7. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  8. java jvm学习笔记二(类装载器的体系结构)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao                  在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱, ...

  9. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

最新文章

  1. iOS网络-NSURLSessionDataTask大文件离线断点下载
  2. 助力深度学习!阿里开源可插拔 GPU 共享调度工具
  3. VALSE Webinar 20-29期 图文并茂, 让视觉与语言相得益彰
  4. [vue] watch的属性用箭头函数定义结果会怎么样?
  5. python程序操作的核心_python核心编程-第五章-个人笔记
  6. 作者:​覃海焕(1978-),女,博士,上海电机学院讲师。
  7. JVM初学之堆的内存模型
  8. Project2010简易操作指南[转]
  9. Hadoop为什么没有采用RAID?
  10. jeesite如何配置swagger_Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解...
  11. java爬虫防屏蔽_Java爬虫技术之绕过百度云防护抓取网站内容
  12. Android IPC系列(三):Binder概述
  13. NYOJ 138 找球号(二) (哈希)
  14. ubuntu中安装软件的方法
  15. 纯C语言实现动态爱心(详解,初学者也能看懂)
  16. 《自己动手写嵌入式操作系统》阅读笔记之操作系统小知识
  17. 怎么将微博图片中的水印去掉
  18. sharedpreferences存不进去_搞笑:主人买了一个钢铁侠模型,小猫咪直接就坐进去了...
  19. 矩阵顺时针旋转90°、180°、270°
  20. 学遥感必读的十本专业书

热门文章

  1. 网页设计与制作第三节文字(页面设计与制作答案)
  2. springboot启动失败的原因及其解决方法
  3. CRLF和LF的区别
  4. 2021年技术体系架构
  5. 阿里云服务器设置IPV6通过AppStore审核
  6. win11微软新系统全新效果曝光
  7. vue 更改 element-ui 中 el-table 默认的暂无数据样式
  8. 计算机网络体系结构i层,计算机网络体系结构及协议之网际互连IBEBEE
  9. 基础运维-杂乱篇-持续更新.......
  10. Hexo站点SEO优化攻略