C# 委托学习笔记(一)
a、委托是什么
1. 委托的定义:
使用delegate关键字定义委托(注:委托没有方法体,类似于接口中的方法)。委托定义前,需要明确的问题:
- 是委托将要绑定的方法;
- 是委托的形参类型、形参个数以及返回值,必须与将要绑定的方法的形参类型、形参个数及返回值一致。
2.相关概念:
委托涉及的相关概念有函数指针 、类型安全性、事件、Lambda表达式等。
- 函数指针:在C++中,指针的一个类别,主要指向函数(变量指针,主要指向变量地址),可以吧C#中的委托理解为函数指针。
- 类型安全性:在C++中,我们都知道指针是类型不安全的(返回值、返回类型以及什么时候返回,这些都是未知的),然而委托是类型安全的;
- 事件:可以把事件理解为一种特殊的委托;
- Lambda表达式:委托与Lambda表达式相结合,可以实现高效编程、它与jQuery中“使用较少的代码做更多的事”类似。委托与Lambda、Linq相结合,使较短的代码实现比较复杂的功能。
3.委托的组成:
主要分为两部分去实现:
- 声明委托:使用delegate关键字声明;
- 绑定方法(注册方法):绑定具体方法、传递方法名称。
4.委托的分类:
- 单播委托:顾名思义只能绑定一个方法;
- 多播委托:则可以绑定多个方法。
5.委托的操作:
- 绑定方法;
- 解绑方法。
b、委托能解决那些问题呢?
- 避免核心方法中存在太多的if…else…语句或者switch开关语句;
- 满足程序设计的OCP(开-闭原则)原则;
- 使得程序具有扩展性;
- 绑定事件;
- 结合Lambda表达式,简化代码,高效编程;
- 实现程序的松耦合(解耦),这种情况在事件(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# 委托学习笔记(一)相关推荐
- IOS之学习笔记十五(协议和委托的使用)
1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...
- C#学习笔记——委托机制
什么是委托?委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成.委托是一个类,当你对它实例化时,要提供一个引用函数,将其作为它构造函数的参数.委托具有以下特点:1)委托类似于 C++ ...
- Mcad学习笔记之委托再理解(delegate的构造器,MulticastDelegate,BeginInvoke,EndInvoke,Invoke4个方法的探讨)...
相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...
- 委托(C#入门详解学习笔记)
委托(C#入门详解学习笔记) 几个概念 什么是委托 委托的声明(自定义委托) 委托的常规使用 通用泛型委托类型的简单使用(Func和Action) 委托的高级使用 多播委托 委托的异步调用 使用接口取 ...
- C#学习笔记:利用System,EventArgs实现委托,响应键盘按键事件
参考书目:C#6.0学习笔记--从第一行C#代码到第一个项目设计(作者周家安)P96 学习目的:掌握System,EventArgs实现委托的方法,响应键盘按键事件.捕捉用户的键盘输入,然后触发Key ...
- 【vn.py学习笔记(六)】vn.py constant源码阅读、委托生命周期
[vn.py学习笔记(六)]vn.py constant源码阅读.委托生命周期 写在前面 1 constant 1.1 Direction 1.2 Offset 1.3 Status 1.4 Prod ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
- java jvm学习笔记二(类装载器的体系结构)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱, ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
最新文章
- iOS网络-NSURLSessionDataTask大文件离线断点下载
- 助力深度学习!阿里开源可插拔 GPU 共享调度工具
- VALSE Webinar 20-29期 图文并茂, 让视觉与语言相得益彰
- [vue] watch的属性用箭头函数定义结果会怎么样?
- python程序操作的核心_python核心编程-第五章-个人笔记
- 作者:​覃海焕(1978-),女,博士,上海电机学院讲师。
- JVM初学之堆的内存模型
- Project2010简易操作指南[转]
- Hadoop为什么没有采用RAID?
- jeesite如何配置swagger_Spring Boot 2.x基础教程:Swagger接口分类与各元素排序问题详解...
- java爬虫防屏蔽_Java爬虫技术之绕过百度云防护抓取网站内容
- Android IPC系列(三):Binder概述
- NYOJ 138 找球号(二) (哈希)
- ubuntu中安装软件的方法
- 纯C语言实现动态爱心(详解,初学者也能看懂)
- 《自己动手写嵌入式操作系统》阅读笔记之操作系统小知识
- 怎么将微博图片中的水印去掉
- sharedpreferences存不进去_搞笑:主人买了一个钢铁侠模型,小猫咪直接就坐进去了...
- 矩阵顺时针旋转90°、180°、270°
- 学遥感必读的十本专业书