C#语言进阶(一)—委托

总目录
C# 语法总目录

委托

    • 委托
      • 1. 基本用法
      • 2.委托作为方法参数
      • 3.多播委托
      • 4.实例对象方法、静态方法与委托之间的关系
      • 5. 委托类型参数为泛型
      • 6. System空间下的 Func 委托和 Action 委托

委托

  委托类似于CPP中的函数指针。它定义了一个方法类型,这个方法类型有返回类型和形参,不需要方法体,但是在声明这个方法类型时要添加delegate关键字

1. 基本用法

切换委托的方法指向,从而执行不同方法。

namespace TopSet
{internal class Program{//声明委托类型delegate int MethodTypeOfDelegate(int a, int b);static void Main(string[] args){//给委托类型赋值MethodTypeOfDelegate mt = Add;Console.WriteLine(mt(1,2));mt = Dec;Console.WriteLine(mt(2,1));Console.ReadLine();}static int Add(int a,int b){return a + b;}static int Dec(int a,int b){return a - b;}}
}--输出
3
1

2.委托作为方法参数

委托类型作为某个方法的参数传入

namespace TopSet01
{internal class Program{//声明委托类型delegate int MethodTypeOfDelegate(int a);static void Main(string[] args){int a = 5;//传入MultiValue(ref a, Add);Console.WriteLine(a);Console.ReadLine();}//委托类型作为参数static void MultiValue(ref int a,MethodTypeOfDelegate mt){a = mt(a);}static int Add(int a){return a * a;}}
}

3.多播委托

  多播委托就是把需要按照顺序执行的,相同类型的委托方法加到一起,执行的时候会按照顺序执行所有的委托方法。可以用于控制台和日志文件的输出。

下方案例仅供演示用法,具体问题需要灵活变通后使用。

namespace TopSet02
{public delegate void MethodTypeOfDelegate(int a);public class Util{public static void PrintSquence(int a,MethodTypeOfDelegate mt){mt(a);}}internal class Program{static void Main(string[] args){MethodTypeOfDelegate? mt = null;//加起来,按照加入的顺序执行mt += PrintSelf;mt += PrintMul;int a = 5;Util.PrintSquence(a, mt);Console.ReadLine();}static void PrintSelf(int a){Console.WriteLine(a);}static void PrintMul(int a){Console.WriteLine(a*a);}}
}--输出
5
25

4.实例对象方法、静态方法与委托之间的关系

  这里实例对象方法指的是 new 出来的一个对象,它的方法赋值给委托变量。委托变量不仅可以调用该方法,而且委托变量还能获取到这些对象方法所对应的对象。如果是静态方法赋值给委托变量,无法获取对应的对象,对象方法可以。

namespace TopSet03
{public delegate void MethodTypeOfDelegate(int a);public class StaticMethodClass{public static void PrintSelf(int a){Console.WriteLine("here is static method: "+a);}}public class NormalClass{public void PrintSelf(int a){Console.WriteLine("here is normal method: " + a);}}internal class Program{static void Main(string[] args){MethodTypeOfDelegate? mt = null;NormalClass nc = new NormalClass();//可以获取到对象方法是来自哪一个类mt = nc.PrintSelf;Console.WriteLine((mt.Target==nc)+"   :"+mt.Method);//无法获取静态方法对应的类mt = StaticMethodClass.PrintSelf;Console.WriteLine(mt.Target == null);Console.ReadLine();}}
}--输出
True   :Void PrintSelf(Int32)
True

5. 委托类型参数为泛型

这个和基本用法几乎一样,就是改个参数类型。

namespace TopSet04
{public delegate T MethodTypeOfDelegate<T>(T a);internal class Program{static void Main(string[] args){MethodTypeOfDelegate<int> mti = Mul;Console.WriteLine(mti(5));MethodTypeOfDelegate<float> mtf = Mulf;Console.WriteLine(mtf(3.0f));Console.ReadLine();}static int Mul(int a){return a * a;}static float Mulf(float a){return a * a;}}
}--输出
25
9

6. System空间下的 Func 委托和 Action 委托

  Func和Action都是委托类型为参数的委托,是System提供的。

  Func委托最后一个泛型类型必须是传出类型而且该委托的返回值必须是传出类型,即必须添加 out 标识符,如果只有一个泛型参数,那么这个泛型必须是 传出类型。

  Action委托是返回值为空的,参数是泛型的委托。

namespace TopSet05
{internal class Program{static void Main(string[] args){Action<int, int> a = Add;a(1, 2);Func<int, int, int> f = Dec;Console.WriteLine(f(2,1));}//Action类型static void Add(int a,int b){Console.WriteLine(a+b);}//Func类型,返回值为intstatic int Dec(int a,int b){return a - b;}}}

总目录
C# 语法总目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/29754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第四十二天|LeetCode1049、LeetCode494 目标和

题1&#xff1a; 指路&#xff1a;1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 思路与代码&#xff1a; 本题中&#xff0c;我们要让剩下的石头重量尽可能小&#xff0c;那么每次就要尽可能找重量相等或最相近的两个石头&#xff0c;如果我们把两个…

3.8. 马氏链-一般状态空间的马氏链(Harris链)

一般状态空间的马氏链-Harris链 1. Harris链及示例1.1. Harris链1.2. 示例2. 修改的Harris链( X ˉ n \bar{X}_{n} Xˉn​)2.1. 修改的Harris链( X ˉ n \bar{X}_{n} Xˉn​)2.2. 三个引理(可以从 X ˉ n \bar{X}_{n} Xˉn​的结论推出 X n X_{n} Xn​的结论)3. 推广相关…

页面置换算法详解

页面置换算法是操作系统中管理虚拟内存的一种技术&#xff0c;特别是在当物理内存不足以容纳所有活跃的进程时。页面置换算法的目标是决定哪些页面应该被保留在物理内存中&#xff0c;哪些应该被交换到磁盘上。以下是一些常见的页面置换算法&#xff1a; 1. **最佳置换算法&am…

【学习】程序员资源网址

1 书栈网 简介&#xff1a;书栈网是程序员互联网IT开源编程书籍、资源免费阅读的网站&#xff0c;在书栈网你可以找到很多书籍、笔记资源。在这里&#xff0c;你可以根据热门收藏和阅读查看大家都在看什么&#xff0c;也可以根据技术栈分类找到对应模块的编程资源&#xff0c;…

Microsoft Visual C++ Redistributable 【安装包】【高速下载】

方法1、可以从官方下载&#xff0c;如下图 Visual C Redistributable for Visual Studio 2015 但是此链接只有一个版本 方法2 已经下载好并且已经整理好了2008--2022的所有版本点击下方链接即可高速下载 如果是win7-win8-win10-win11直接可以下载2015--2022版本&#xff0c…

KDtree高维空间特征向量分类树的缺陷与补救方案

背景描述 最近在做高维特征向量查找比对的过程中&#xff0c;由于数据库内的数据过于庞大&#xff0c;从头遍历效率太低&#xff0c;故想要寻找一些快速的高维空间向量的查找方式。 经过调研与学习&#xff0c;笔者发现有球树、KDtree等多种高维空间向量查找方式&#xff0c;…

如何避免死锁?

避免死锁是多线程编程中的一个重要问题。死锁通常发生在多个线程持有资源并等待其他线程释放资源时&#xff0c;如果这些线程以不同的顺序请求资源&#xff0c;可能会导致它们永远等待下去。 以下是一些避免死锁的策略&#xff1a; 1.避免循环等待&#xff1a; 确保线程以相同…

DOCTYPE的作用

DOCTYPE是document type&#xff08;文档类型&#xff09;的缩写&#xff0c;它位于HTML文档的最前面&#xff0c;处于<html>标签之前。DOCTYPE声明的主要作用是告诉浏览器的解析器使用哪种HTML规范或者XHTML规范来解析页面。 1. 提高浏览器兼容性 在W3C标准出来之前&a…

大模型基础知识:探索人工智能的巨轮

人工智能大模型&#xff0c;这个在近年来频繁出现在科技新闻和学术论坛的热门词汇&#xff0c;已经成为了推动人工智能技术发展的关键力量。这些大模型&#xff0c;如OpenAI的GPT-3、谷歌的BERT、百度的ERNIE等&#xff0c;以其强大的性能和广泛的应用范围&#xff0c;引起了广…

js原型链原理与查找机制

JavaScript中的原型链是实现继承的机制&#xff0c;它是基于对象的。每个对象都有一个内部指针&#xff08;proto&#xff09;&#xff0c;指向它的原型对象&#xff08;prototype&#xff09;。原型对象也是一个对象&#xff0c;同样具有自己的原型对象&#xff0c;形成一个链…

【AI大模型】在健康睡眠监测中的深度融合与实践案例

文章目录 1. 应用方案2. 技术实现2.1 数据采集与预处理2.2 构建与训练模型2.3 个性化建议生成 3. 优化策略4. 应用示例&#xff1a;多模态数据融合与实时监测4.1 数据采集4.2 实时监测与反馈 5. 深入分析模型选择和优化5.1 LSTM模型的优势和优化策略5.2 CNN模型的优势和优化策略…

若依RuoYi-Vue分离版—配置多数据源

若依RuoYi-Vue分离版—配置多数据源 一、修改application-druid.yml二、修改pom文件&#xff0c;引入依赖第一种&#xff1a;下载jar包到本地&#xff0c;然后引入&#xff08;我这边用的是这种&#xff09;本地引入的&#xff0c;打包时需要加上配置 第二种&#xff1a;从远程…

随想录Day63 | 单调栈 42. 接雨水 84.柱状图中最大的矩形

随想录Day63 | 单调栈 42. 接雨水 84.柱状图中最大的矩形 42. 接雨水 题目链接 42 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 第一次提交 class Solution { public:int trap(vector<int>…

模板类的实例—栈

#include<iostream>using namespace std;typedef int Datatype;class Stack { private:Datatype* items;//栈数组int stacksize;//栈的实际大小int top;//栈顶指针 public://构造函数&#xff1a;1&#xff09;分配栈数组内存&#xff0c;2&#xff09;把栈顶指针初始化为…

云原生微服务开发日趋成熟:有效拥抱左移以改善交付

在软件工程和应用程序开发方面&#xff0c;云原生已经成为许多团队的常用术语。当人们调查云原生的世界时&#xff0c;他们经常会得出这样的观点&#xff1a;云原生的整个过程都是针对大型企业应用程序的。几年前&#xff0c;情况可能确实如此&#xff0c;但随着 Kubernetes 等…

解码 ResNet:残差块如何增强深度学习性能【数学推导】

ResNet简介 残差网络结构 残差网络&#xff08;ResNet&#xff09;是由何凯明等人在2015年提出的&#xff0c;它极大地提高了深度神经网络的训练效果&#xff0c;尤其是非常深的网络。ResNet的核心思想是引入“残差块”&#xff08;Residual Block&#xff09;&#xff0c;通…

《Fundamentals of Power Electronics》——理想变压器基本公式推导

接下去推导理想变压器的基本公式。理想变压器满足以下三个条件&#xff1a; 1、无铜损。假设原副边线圈均无纯电阻&#xff0c;则不会因在铜导线中产生焦耳热引起能量损耗&#xff0c;另外也不考虑回路中的分布电容。 2、无铁损。忽略通过铁芯的磁通量变化引起的涡流损耗&…

线性二次型调节器(LQR)举例

线性二次型调节器(LQR) 线性二次型调节器(LQR)是一种用于最优控制的问题,其中目标是通过最小化某个代价函数来找到最优控制策略。LQR特别适用于线性系统。为了在人形机器人上应用LQR进行建模,主要步骤包括建立系统模型、定义代价函数以及求解最优控制律。以下是详细步骤…

Chromium 开发指南2024 Mac篇-Xcode安装(二)

1.引言 在开始编译和开发 Chromium 之前&#xff0c;确保开发环境的正确配置是至关重要的。对于 Mac 用户来说&#xff0c;Xcode 是不可或缺的工具&#xff0c;因为它不仅提供了必需的编译器和工具链&#xff0c;还包含了与 macOS 系统深度整合的开发资源。在本系列指南的第一…

redis从入门到进阶——数据类型、 操作、数值操作、发布订阅、消息队列、布隆过滤器、事务

文章目录 基础数据类型操作数值操作 进阶发布订阅消息队列布隆过滤器事务 基础 数据类型 string&#xff0c;set, hash, list, zset 操作 string符串类型&#xff1a; 保存一个字符串&#xff1a;set key value [EX seconds|PX milliseconds...] [NX|XX]EX&#xff1a;设置…