首页 > 编程语言 >刘铁猛C#学习笔记13 委托1

刘铁猛C#学习笔记13 委托1

时间:2024-02-23 23:23:32浏览次数:32  
标签:13 刘铁猛 委托 C# 调用 参数 返回值 函数指针 方法

“幻想:如果能有一种能把方法当参数的方法就好了”

一、什么是委托

委托源自C、C++中的函数指针  

1.C语言中的函数指针

(1)函数的直接调用

先准备好一个加法函数,一个减法函数 可以通过函数名调用这两个函数,这种调用方法称作直接调用  

(2)函数指针的声明、间接调用

先按下图中的方法声明一个函数指针数据类型 然后创建一个这个数据类型的指针变量,将Add函数的地址存入其中 之后不再直接调用这两个函数,而是通过函数指针间接调用他们 间接调用与直接调用结果是完全一样的,因为无论直接和间接,CPU访问的那组包含算法的机器语言是一样的  

(3)一切皆地址

数据(变量)的存在内存中的,算法(函数)也是存在内存中的 所以其在内存中存储的地方都有地址  

(4)C#与JAVA

JAVA是由C++演化来的,为程序安全性考虑,JAVA禁止直接访问内存地址,彻底舍弃了所有与指针相关的内容 C#也是由C++演化而来,但通过委托保留了C++中的函数指针内容  

二、Action委托(无参无返回值)

使用Action这种数据类型,其图标为一个手提包,意为打包装着一些方法 Action委托类型的变量的初始器,可以在括号内写上要塞进委托里的方法 括号内只写方法名,不写圆括号,因为写上圆括号意为调用方法   直接调用方法:如往常一样

用委托间接调用方法

写法1 action.Invoke()

通过action.Invoke()方法调用被装在委托实例action中的方法 直接调用与间接调用效果完全一样  

写法2 action();

模仿函数指针的简便调用写法,直接把委托实例当函数使用    

三、Func泛型委托(泛型委托,声明需写上参返类型)

Func是function的缩写,这是一种泛型委托 (感觉写法类似unity里的获取组件那样的泛型方法?)  

1.Func泛型委托的声明

他有多种重载,不同重载有不同数量的类型参数< > 这些尖括号类型参数< >,表示的是目标方法的参数类型   我们现在要把Add方法和Sub方法塞进这个Func委托,所以选择这个重载,有T1、T2两个int类型参数,有TResult这一个返回值 所以在尖括号中依次写上参数和返回值的类型(写法类似获取组件那样的泛型方法) 将要塞进委托里的方法名写在初始化器的圆括号内  

2.Func泛型委托的调用

(1)用func.Invoke(···)方法调用

圆括号内写上参数  

(2)用类似函数指针的func(···);调用

圆括号内写上参数,就像普通调用方法一样  

四、自定义委托

委托是一种类Class,但考虑到可读性和C、C++传统,其声明方法仿照函数指针 委托作为类也要声明在命名空间体

声明委托delegate

delegate表示声明的是一个委托,之后写上目标方法的返回值、委托名、目标方法参数列表  

委托的初始化与调用

创建自定义委托类型的变量后,需要用初始化器创建委托实例 委托的初始化器括号中写要塞进委托的方法 能塞进去的方法必须满足委托声明时定下的返回值类型、参数列表的要求

Invoke间接调用

函数指针式调用

    委托与所封装的方法必须保持“类型兼容”,返回值类型、参数列表类型一致  

五、委托的一般使用

常用实例:委托参数

使用委托作为方法的参数,将委托封装的方法传入方法体,在方法体中间接调用 形成一种能够动态调用方法的“活字印刷术”

1.模板方法

通过委托参数,间接的在方法体中调用指定的外部方法,作为委托参数被调用的方法一般是有返回值的方法,然后使用其返回值继续执行方法体中的逻辑 相当于方法中留空,可以动态地在留空处塞外部方法,来活字印刷  

2.回调方法(callback)

某个方法用得到的时候就用,不用的时候就不用 将委托参数传入主调方法,委托参数内封装着回调方法 主调方法根据自己的逻辑来判断是否调用回调方法,一般在主调方法的末尾,执行一些后续工作 因为在末尾,没后续,所以回调方法一般是没有返回值  

示例:模板方法与包装工厂

暂时无法在飞书文档外展示此内容 这样当一个产品的生产程序出问题时,不会干扰其他产品的生产和包装 需要维护一个产品的生产程序时,也不需要动其他产品的生产和包装程序 提高维护性、可扩展性  

示例2:回调方法与记录者

回调方法也称作好莱坞方法 演员去面试,给导演留了名片 导演说如果选中他,会给他打电话的 暂时无法在飞书文档外展示此内容   后:回调方法就是不每一帧检测,等事件来触发

委托注意事项

委托是一种方法级别的耦合,通常是违反设计模式的(后:可使用观察者模式/事件消息系统解决此问题) 会引起可读性急剧下降委托回调、异步调用和多线程纠缠在一起,会对代码的可读性维护性产生灾难性的后果 委托使用不当可能造成内存泄露程序性能下降  

标签:13,刘铁猛,委托,C#,调用,参数,返回值,函数指针,方法
From: https://www.cnblogs.com/jk-2048/p/18030536

相关文章

  • C++ 令人无语/好用的语法合集
    此贴用来总结一些傻逼C++语法,或者坑了我很久的写法。1、(坑)重载>,<,==时,千万不要使用pair为基的typedef!!!!!!pii的max不受你的重载影响,它自己有自己的max,然后typedef和define是相同的,基本可以看做直接替换,不会对作用域/命名做区分。2、(坑)lower_bound(..,..,{x......
  • containerd环境搭建指南
    目录一.container概述1.什么是containerd2.为什么要学习containerd二.基于yum方式安装containerd1.获取软件源2.查看yum源中containerd软件版本3.安装containerd的4.查看containerd的版本信息5.设置containerd开机自启动6.查看containerd的客户端和服务端的版本信息三.基于二进制......
  • SciTech-EECS-PCB电路板设计-使用KiCad进行PCB设计的基本流程
    使用KiCad进行PCB设计的基本流程,2024-02-2314:04KiCad是一款强大的开源PCB设计软件,其设计的大体流程包括:原理图设计及导出网表文件,PCB布局和布线,导出Gerber文件及制板;以下是使用KiCad进行PCB设计的基本步骤:0.安装KiCad:首先,你需要安装KiCad软件。KiCad官方网站下载......
  • 刘铁猛C#学习笔记10 字段、属性
    这四种东西都是用来表达数据的一、字段(成员变量)曾用名:成员变量是为一个对象或类型存储数据的变量,区别于方法体中的局部变量多个字段组合起来可以表示对象当前的状态起源:C语言中结构体的成员变量一个对象占用的内存空间会被分配给各个字段1.实例字段和静态字段可以分为......
  • 刘铁猛C#学习笔记11 索引器、常量
    一、索引器[]概述使一个对象可以像数组一样用方括号[]去访问其元素ex:字典的声明 1.索引器的声明首先像上文那样声明一个字典Dictionary<,>在VS中输入indexer,然后敲两下tab就能得到:(按下tab可以跳到下一个可编辑项上)第一个类型参数为返回值的类型,第二个类型参数为......
  • 刘铁猛C#学习笔记12 参数种类详解
    一、值参数(传值参数、值传递)指参数的种类为值参数,而非参数数据类型为值类型1.值类型的传值参数类似一个新声明的局部变量,或传进来的实参的一个副本可以在方法体内重现赋值,但其在方法体内被赋值时,不会影响传进来的本体 2.引用类型的传值参数引用类型变量存储的是实例......
  • 代码随想录算法训练营day03 | leetcode 203. 移除链表元素、707. 设计链表、206. 反转
    目录题目链接:203.移除链表元素-简单题目链接:707.设计链表-中等题目链接:206.反转链表-简单题目链接:203.移除链表元素-简单题目描述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6......
  • 恢复VCPkg(2023-01-27)中Vtk[Qt]的默认依赖为Qt5
    通过查看vtk的更新的日志已于2023-01-27将默认依赖的Qt的版本由5更新到6gitlog--.\ports\vtkcommit27fb19bdcc1f6ddb1261cffb5372724ac1d63a93Author:LilyWang<94091114+LilyWangLL@users.noreply.github.com>Date:2023-08-23[manyports]FixURLSofdownlo......
  • P9370 APIO2023 cyberland
    题面:https://www.luogu.com.cn/problem/P9370显然只有从\(0\)出发不经过\(H\)能到达的点是有用的。首先,考虑跑多源最短路,将\(arr=0\)的点都作为源点(当然\(0\)也是源点)。不难发现这样转化后,这些点即可视作\(arr=1\)。对于\(arr=2\)的点,由于能使用除以二技能的次数很......
  • POLIR-Economics-西方经济学学习经验(转发)
    原文:https://bbs.pinggu.org/thread-894259-1-1.htmlhttps://bbs.pinggu.org/forum-47-1.html西方经济学属于纯理论性的学科,它所包括的知识也基本上是比较模式化的,也就是说,相对于政治经济学它联系实际的东西比较少,能与实际联系起来的地方主要是宏观部分的财政政策、货币政策、通......