C#中的委托(Update)
什么是委托?
委托(delegate)是一种托管方法的数据结构,它是一种引用类型,是对方法的引用。如果说int,string等是对数据类型的定义,那么委托就类似于对“方法类型”的定义,声明一个委托,就是声明一种方法签名,只要是和声明委托方法签名相同的方法,都可以被委托实例托管。那为什么叫委托呢,这个名字似乎看似和它的职责不相干,但其实这是很“面向对象”的称呼,一个方法自己办不到的事情,去让另一个方法帮他做,这两者之间的关系不就是委托吗,这样的抽象关系不就是面向对象的一部分吗。
如何声明一个委托?
委托的关键字是delegate ,由它开头,后边接返回值类型,委托名称以及参数具体如下:
delegate 返回值类型 委托名称 (方法参数)

如何使用委托?
声明一种委托类型,就像声明类一样,我们使用的时候需要先实例化,然后通过构造传参或者“+=”的方法为委托实例添加托管方法,委托可以托管多个方法。
首先,你要确保要添加的方法,是符合委托类型的,也就是方法签名要一致。判断方法签名是否一致的两个要素就是:返回值类型,参数类型、参数数量,这几项都要一一对应。

上方有三个测试方法,分别是无参数无返回值,有参,有返回值的方法。下面通过代码来体现委托的用法:
class Program
{
delegate void NoReturnNoArgsDele();
delegate int HasReturnNoArgsDele();
delegate int HasReturnAndArgsDele(int arg); static void Main(string[] args)
{
DelegateTest delegateTest = new DelegateTest();
//实例化委托,并通过构造器传入要委托的方法
NoReturnNoArgsDele noReturnNoArgs = new NoReturnNoArgsDele(delegateTest.NoReturnNoArgs); HasReturnNoArgsDele hasReturnNoArgs = new HasReturnNoArgsDele(delegateTest.HasReturnNoArgs);
//委托内部重载了+= 和-=运算符,可以通过这两个运算符为委托对象添加或移除方法
hasReturnNoArgs+= delegateTest.HasReturnNoArgs; HasReturnAndArgsDele hasReturnAndArgs = new HasReturnAndArgsDele(delegateTest.HasReturnAndArgs); Console.WriteLine("Hello World!");
}
}
声明了委托,那如何使用呢?委托的使用跟方法的调用一致:

另外,我们如果为委托实例添加多个方法,在调用委托时,就会根据添加顺序依次调用,这种通过委托一次性调用多个方法的过程,称作委托的多播。注意,如果如果是有返回值得委托,执行多播以后,委托的返回值是最后添加的方法的返回值。
Action和Func泛型委托
Action和Func泛型委托是微软为我们实现定义好的两组委托,这两组委托,足以满足我们的日常使用,而无需自己去定义委托。
先来了解一下它们的定义,


他们都是处于System命名空间下。
Func委托,它托管有返回值的方法,它的构造方法的重载有17个之多,也就是说,你可以用它匹配最多有16个参数的带有返回值的方法,这足以满足绝大多数我们使用委托的情景。
Action委托,它托管没有返回值的方法,同func委托一样,它可以最多匹配16个参数的无返回值方法。
由此,以上我们自定义的委托就可以换为以下代码:

把参数类型或者返回值类型(如果需要它们)写在尖括号中,它的实现原理是泛型,如果不明白泛型,请留意后期的文章。
委托在方法参数中的应用
如果你想实现方法的多样化定制,使用委托作为参数是必不可少的。

想通过一个方法实现不同的操作,可以动态的去改变代码逻辑,这就需要使用委托,用方法封装一些固定的逻辑,用委托方法写不同的代码逻辑,去实现多样化的需求,这就是委托的魅力所在。
个人公众号:DotNet 致知 ,愿我们一同进步。
C#中的委托(Update)的更多相关文章
- C#中的委托和游戏中的运用
C#中的委托与游戏中的运用 1.什么是委托 在C/C++中,有函数指针的概念,即指向函数的指针.当我们调用该指针时,就相当于调用了该指针所指向的函数,这就是函数指针的一个作用,而他另一个作用就是将自己 ...
- Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件
一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...
- C# 中的委托和事件
觉得这篇文章写的非常好,大神之作,由简入繁,对我这种初学者来说帮忙很大,特此留存下. 摘自:http://tracefact.net/CSharp-Programming/Delegates-and- ...
- unity3D脚本中,update ,fixupdate 和lateupdate的区别
1.MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. 2.MonoBehaviour.FixedUpdate 固定更新 当MonoBe ...
- Objective-C中的委托(代理)模式
我个人更喜欢把委托(Delegate)模式称为代理(Proxy)模式.还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的.当时学习Spring的时候用到了接口 ...
- C# 中的委托和事件(转)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C# 中的委托和事件(转载)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- 【转】C# 中的委托和事件
阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...
- 在MySQL中阻止UPDATE语句没有添加WHERE条件的发生
如果在生产环境中使用UPDATE语句更新表数据,此时如果忘记携带本应该添加的WHERE条件,那么..Oh,no…后果可能不堪设想.那么有没有什么办法可以阻止这样的事情发生,又不使用任何的审核工具呢.. ...
随机推荐
- win8 下删除服务
1.右键 我的电脑-管理-服务和应用程序-服务,找到想要删除的服务,双击后复制服务名称. 2.管理员身份运行cmd 在命令框中输入 sc delete "secbizsrv" 就删 ...
- 仿MSDN的帮助系统
作为软件开发人员,软件做好后,接下来就是编写文档.我自己也是做软件的,经常有用户询问软件的安装与使用, 我一直很喜欢微软的MSDN帮助系统,简介.大气,使用方便. 网上也找了很久,感觉一直没有合适的, ...
- IPFS挖矿原理介绍
随着近几年区块链行业迅速发展,虚拟货币交易机制逐渐成熟,作为「区块链新贵」的 IPFS渐渐走入广大投资者的视线. IPFS 与其激励层的运作原理是投资者们必须要了解的.所以今天我就来和大家讲讲 IPF ...
- IDEA中通过正则表达式批量替换空白行
快捷键Ctrl+r 填入^\s*\n,勾选Regex,Replace all
- Java系列教程-SpringMVC教程
SpringMVC教程 1.SpringMVC概述 1.回顾MVC 1.什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务 ...
- CPython-对象/类型系统
Python中一切皆对象,包括实例对象和类型对象,如整数.浮点数.字符串是实例对象,整数类型.浮点数类型.字符串类型是类型对象. # [Python]>>> n=10 >> ...
- webpack核心模块tapable源码解析
上一篇文章我写了tapable的基本用法,我们知道他是一个增强版版的发布订阅模式,本文想来学习下他的源码.tapable的源码我读了一下,发现他的抽象程度比较高,直接扎进去反而会让人云里雾里的,所以本 ...
- CodeForces CF875C题解
题解 非常有意思的\(2-SAT\)的题. 听学长讲完之后感觉确实容易想到\(2-SAT\),顺理成章. 显然,对于两个串,对咱们来说有意义的显然是两个串中第一个不同的数字.那么,我们假设两个串分别是 ...
- 我的xshell配色方案,绿色/护眼/留存/备份
[mycolor] text(bold)=e9e9e9 magenta(bold)=ff00ff text=00ff80 white(bold)=fdf6e3 green=80ff00 red(bol ...
- ICMP主机探测过程
#1from scapy.all import * from random import randint from optparse import OptionParser #2 对用户输入的参数进行 ...