委托、Lambda表达式

devtools/2024/11/25 10:20:43/

委托

什么是委托?

委托是类类型,也就是引用类型,能声明变量,创造实例。但委托是一种特殊的类,一般的类是用来反应现实事物的,而委托类只是用来包裹方法的,通过委托实例可以来间接调用这些包裹的方法。所以可以说委托就是一个或一组方法的封装器

using System;
using System.Collections.Generic;
namespace ConsoleApp2
{internal class Program{static void Main(string[] args){//委托能包裹的方法,必须与委托的返回值、参数列表一致。如下就是void返回值、以及0个参数MyDele myDele11 = new MyDele(f1);myDele11.Invoke();//执行包裹着的方法,可以简化成myDele11();}static void f1() { Console.WriteLine("方法一"); }}delegate void MyDele();//委托声明
}


泛型委托

手动声明委托类型

namespace ConsoleApp2
{internal class Program{static void Main(string[] args){MyDele<int> myDele11 = new MyDele<int>(f1);//用int替换TmyDele11.Invoke(1,2);//执行包裹着的方法MyDele<double> myDele22 = new MyDele<double>(f2);//用int替换TmyDele22(1.21, 3.14159);//执行包裹着的方法}static int f1(int x,int y) { return x+y; }static double f2(double x,double y) { return x+y; }}}delegate T MyDele<T>(T a,T b);//泛型委托声明
}

实际上类库已经声明好了泛型委托,不用自己去声明。主要有两大类,有返回值的Func,以及无返回值的Action。

以下是使用action委托

using System;
using System.Runtime.CompilerServices;namespace ConsoleApp2
{internal class Program{static void Main(string[] args){Action action11 = new Action(f11);//使用action委托封装无参方法Action<int, string> action22 = new Action<int, string>(f22);//使用action委托封装有参方法}static void f11() { Console.WriteLine("我是无参无返回值方法"); }static void f22(int a,string s) { Console.WriteLine($"我是#{a}号,{s}"); }}
}

以下是使用function委托

using System;
namespace ConsoleApp2
{internal class Program{static void Main(string[] args){var func11 = new Func<int, int, int>(f1);//表示包裹一个为int返回值、2个int参数的方法}static int f1(int x,int y) { return x+y; }static double f2(double x,double y) { return x+y; }}}
}

Lambda表达式

lambda 是一种匿名方法、Inline方法(边声明边使用)。

把一个lambda表达式赋值给一个委托类型变量

代码实例:

using System;
namespace ConsoleApp3
{internal class Program{static void Main(string[] args){Func<int, int, int> func1 = new Func<int, int, int>((a, b) => { return a + b; });Console.WriteLine(func1(231,43));}}
}

代码详解:

首先里面的lambda表达式是(a, b) => { return a + b; },它处于原本该放方法名的地方,不难相出这个lambda表达式代表着一个方法,表示将int类型的a,b带入花括号中,而花括号代表着返回一个相加后的int值。

观察lambda表达式代表的方法,是匿名的,没有名字。执行到这的时候,是边声明就边使用

这段代码还可以简化成:

 Func<int, int, int> func1 = (a, b) => { return a + b; };

把一个lambda表达式喂给一个委托类型参数

观察上述 Func<int, int, int> func1 = (a, b) => { return a + b; };,它可以将一个lambda表达式来直接实例一个泛型委托,当然具体实现上不是这么简单,但是可以以这种形式完成,那么就可以想到有一个泛型委托形参,我们可以用lambda表达式当成泛型委托实参。

可以用类比int类型,这个泛型委托形参,代表着可以传进去某一组方法(这里是指有2个T参数,1个T返回值),就像int形参,传入参数为像1,3,543这种整数。那个传进去的方法可以用lambda写出表示。

using System;
namespace ConsoleApp4
{internal class Program{static void Main(string[] args){FangFa<int>((int a, int b)=>{ return a * b; },100,200);//放入三个参数}//泛型方法中有3个参数,第一个参数类型是泛型委托static void FangFa<T>(Func<T,T,T>func,T x,T y){T result=func(x,y);//调用泛型委托中的方法,该方法自己在主函数中边声明,边调用Console.WriteLine(result);}}
}

FangFa<int>((int a, int b)=>{ return a * b; },100,200);

可以将里面的int省去,因为100,200明显是整数,也就是T是int整数。系统自己能推断出来。所以写int多余了,可以将此代码写成:

FangFa((a, b)=>{ return a * b; },100,200);


http://www.ppmy.cn/devtools/136815.html

相关文章

决策树——基于乳腺癌数据集与cpu数据集实现

决策树——乳腺癌数据实现 4.1 训练决策树模型,并计算测试集的准确率 1. 读入数据 from sklearn import datasets from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix …

[高阶数据结构三] B-树详解

1.前言 相信大家或多或少的都听过B树&#xff0c;本篇文章将带领大家一步一步学习B树&#xff0c;从了解他的概念到模拟实现他的插入过程。 本章重点&#xff1a; 了解B树的相关概念后&#xff0c;由于后续学习B树的插入过程较难&#xff0c;所以会一步一步的对他的插入进行分…

C++:用红黑树封装map与set-1

文章目录 前言一、STL源码分析二、红黑树的构建三、map与set整体框架的搭建与解析四、如何取出进行比较&#xff1f;1. met与set的数据是不同的2. 取出数据进行比较1&#xff09;问题发现2&#xff09;仿函数解决 五、封装插入六、迭代器的实现1. operator* 与operator->2. …

Dubbo Golang快速开发Rpc服务

开发 RPC Server & RPC Client 基于 Dubbo 定义的 Triple 协议&#xff0c;你可以轻松编写浏览器、gRPC 兼容的 RPC 服务&#xff0c;并让这些服务同时运行在 HTTP/1 和 HTTP/2 上。Dubbo Go SDK 支持使用 IDL 或编程语言特有的方式定义服务&#xff0c;并提供一套轻量的 …

【计算机网络】IP协议

一、IP协议的功能 提供将数据从A主机跨网络送到主机B的能力 (在复杂的网络环境中确定一个合适的路径) 二、IP协议格式 ​​​​​​​1.报头的含义 &#xff08;1&#xff09;一般字段 ① 4位版本&#xff1a;指定IP协议的版本&#xff0c;对于IPv4来说就是4 ② 4位首部长度…

定时/延时任务-Timer用法

文章目录 1. 概要2. 简述2.1 固定速率2.2 固定延时2.3 区别 3. Timer 的用法3.1 固定延时 - public void schedule(TimerTask task, long delay, long period)3.1.1 解释 3.2 固定延时 - public void schedule(TimerTask task, Date firstTime, long period)3.3 固定速率 - pub…

mfc100u.dll是什么?分享几种mfc100u.dll丢失的解决方法

mfc100u.dll 是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;属于 Microsoft Foundation Classes (MFC) 库的一部分。MFC 是微软公司开发的一套用于快速开发 Windows 应用程序的 C 类库。mfc100u.dll 文件包含了 MFC 库中一些常用的函数和类的定义&#xff0c;这…

C++设计模式:建造者模式(Builder) 房屋建造案例

什么是建造者模式&#xff1f; 建造者模式是一种创建型设计模式&#xff0c;它用于一步步地构建一个复杂对象&#xff0c;同时将对象的构建过程与它的表示分离开。简单来说&#xff1a; 它将复杂对象的“建造步骤”分成多部分&#xff0c;让我们可以灵活地控制这些步骤。通过…