当前位置: 首页 > news >正文

C#基础——委托、Action和Func的使用

1、委托

委托(Delegate)是一种类型,可以用来表示对一个或多个方法的引用。委托提供了一种方便的方式来将方法作为参数传递给其他方法,或将方法存储在数据结构中以供以后调用。

不带参数且没返回值的委托

delegate void HDLDelegat(); //声明了一个无参数返回的委托//定义一个函数作为委托的主体
static void HaiDiLao() {Console.WriteLine("海底捞总部");
}HaiDiLao(); //如果直接调用不是委托
//使用委托
HDLDelegat hdl = new HDLDelegat(HaiDiLao);
hdl(); //这里就相当于调用了 HaiDiLao()}

带参数没有返回值的委托

//定义委托
delegate void KaiFengCai(int money);//定义位委托的主体
static void KFC(int money) {if (money >= 100000) Console.WriteLine("才可以加盟肯德基");else Console.WriteLine("资质不够肯德基");
}//使用委托
KaiFengCai kaifengcai = new KaiFengCai(KFC);
kaifengcai(1000000);

带参数有返回值的委托

//定义委托
delegate string MaiDangLao(int money);//定义位委托的主体
static string MDL(int money) {string str = "";if (money >= 100000) str = "才可以加盟麦当劳";else str = "资质不够麦当劳";return str;
}//使用委托
MaiDangLao maidnaglao = new MaiDangLao(MDL);
Console.WriteLine(maidnaglao(1000000));

参数是一个委托的委托

//定义一个委托
delegate void MyDelegate();
//定义一个参数是另一个委托的委托
delegate void MyDelegate3(MyDelegate myDelegate);static void ProgramMothod() {Console.WriteLine("这是MyDelegate的委托");
}
//注意这个方法使用的时候需要传入委托对象
static void ProgramMothod3(MyDelegate mdelegate) {mdelegate(); //直接调用这个函数,相当于调用了ProgramMothod函数
}//使用委托
MyDelegate3 m3 = new MyDelegate3(ProgramMothod3);
m3(ProgramMothod);

参数是一个委托和一个数据类型的委托

//定义一个有参数的委托
delegate void MyDelegate2(int a, int b);
//定义一个参数是委托和数据类型的委托
delegate void MyDelegate4(MyDelegate2 myDelegate, int a);static void ProgramMothod2(int aValue, int bValue) {Console.WriteLine("{0}这是MyDelegate2的委托,{1}", aValue, bValue);
}
//定义一个参数是另一个委托和int类型的方法
static void ProgramMothod4(MyDelegate2 mdelegate, int a) {mdelegate(a, 90);
}MyDelegate4 m4 = new MyDelegate4(ProgramMothod4);m4(ProgramMothod2, 90); //参一是ProgramMothod2,参二是a

泛型也能和委托一起使用

//定义一个泛型委托
delegate void MyDelegate5<T>(T a);static void ProgramMothod5(string a) {Console.WriteLine(a);
}//使用委托
//委托的目的是:让方法通过委托来调用,加了泛型之后就表示委托的方法里面出来的数据类型需要和泛型有关才可以
MyDelegate5<string> m5 = new MyDelegate5<string>(ProgramMothod5);
m5("使用泛型的委托");

返回类型和参数都设置成泛型

//定义一个参数和返回值都是泛型的委托
delegate T MyDelegate6<T, D, W>(T A, D B, W c); static string ProgramMothod6(string a, int b, double c) {return a + b + c;
}//使用委托
MyDelegate6<string, int, double> m6 = new MyDelegate6<string, int, double>(ProgramMothod6);
Console.WriteLine(m6("100", 200, 300f));

Action和Func的使用

官方希望开发者自定义delegate,提供了 Action和Func来协助完成委托

其中Action用来描述一个void返回类型的方法,Func描述一个带有返回类型的方法

2、Action的使用

无返回值无参数的委托

 Action action = new Action(ProgramMothod);action();static void ProgramMothod() {Console.WriteLine("无返回类型无参数的方法");
}

无返回类型有一个值的委托

 Action<int> acction2 = new Action<int>(ProgramMothod2);acction2(100);static void ProgramMothod2(int a) {Console.WriteLine("无返回类型有一个参数的方法:传递了a{0}", a);
}

无返回值类型有一个string参数和一个类参数的委托

 ~~~csharp

Action<string, People> action3 = new Action<string, People>(ProgramMothod3);
People p = new People();
p.Name = “郭贝贝”;
action3(“这个博主叫做:”, p);

static void ProgramMothod3(string str, People p) {
Console.WriteLine(“无返回值类型有一个string参数和一个类参数的方法” + str + p.Name);
}

//声明一个类
class People {
public string Name;
}
~~~

注意:Action不能委托带有返回类型的方法

//Action action4 = new Action(TextModth1); //报错
3、Func的使用

有返回类型无参数的委托

Func<int> func = new Func<int>(TextModth1);
Console.WriteLine(func()); //100static int TextModth1() {return 100;}

有参数有返回类型的委托

//当设置了多个泛型之后,以最后一个作为返回类型(前面的泛型当作参数类型)
Func<int, string, string> func2 = new Func<int, string, string>(TextModth2);
Console.WriteLine(func2(100, "200")); //100200static string TextModth2(int a, string b) {return a + b;}

有参数有返回类型且返回类型是个类的委托

Func<int, People, People> func3 = new Func<int, People, People>(TextModth3);
People people = new People();
people.Age = 100;
Console.WriteLine(func3(18, people).Age); //118static People TextModth3(int age, People p1) {People people = new People();people.Age = age + p1.Age;return people;}class People {public string Name;public int Age;
}
http://www.lryc.cn/news/263673.html

相关文章:

  • 不止业务缓存,分布式系统中还有哪些缓存?
  • Java 基础学习(十三)集合框架、List集合
  • el-select二次封装实现可分页加载数据
  • css实现0.5px宽度/高度显——属性: transform: scale
  • html懒人加载实现
  • Axure情形动作篇(ERP登录效验)
  • LeetCode刷题--- 子集
  • 【SQL】根据年份,查询每个月的数据量
  • 基于CTF探讨Web漏洞的利用与防范
  • Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现
  • 海康威视IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)
  • IDE:DevEco Studio
  • 【QT】C++/Qt使用Qt自带工具windeployqt打包
  • Ubuntu系统的基础操作和使用
  • harmonyOS 自定义组件基础演示讲解
  • 我的创作纪念日——成为创作者第1024天
  • 正点原子驱动开发BUG(一)--SPI无法正常通信
  • SpringBoot接入轻量级分布式日志框架GrayLog
  • 光电器件:感知光与电的桥梁
  • Ceph入门到精通-smartctl 查看硬盘参数
  • Module build failed: TypeError: this.getOptions is not a function
  • 蓝牙电子价签芯片OM6626/OM628超低功耗替代NRF52832
  • ELK(八)—Metricbeat部署
  • Ansible自动化运维以及模块使用
  • 数据分析场景下,企业大模型选型的思路与建议
  • Mongodb复制集架构
  • 云原生之深入解析Kubernetes集群发生网络异常时如何排查
  • error: C2039: “qt_metacast“: 不是 “***“ 的成员
  • 量子计算:开启IT领域的新时代
  • 数据可视化---柱状图