首页 > 编程语言 >C#委托和事件简单复习

C#委托和事件简单复习

时间:2023-08-01 19:34:40浏览次数:37  
标签:Console 复习 委托 C# say WriteLine Tom name

C#委托

太久没用了,简单的复习一下
快速过一遍语法使用

使用委托的步骤

1.定义一个委托类型
只需要在声明的前面加上delegate关键字,其他的就跟声明一个方法(函数)类似

public delegate void SayHello(string name);

2.使用刚刚声明的委托
需要定义一个返回值跟参数与我们刚刚定义的委托一致

public static void MyFunc(string name)
{ 
	Console.WriteLine($"Hello {name}");
}

3.然后声明一个SayHello类型(委托)的变量
把前面定义的方法赋值给变量
然后就可以使用委托像正常调用MyFunc一样使用该方法

SayHello say = MyFunc;
//调用委托
say("Tom");
//进入MyFunc输出 "Hello Tom"

也可以使用Lambda表达式给委托赋值

SayHello say = (string name)=> {
	Console.WriteLine($"Hello {name}");
};

SayHello say = name=> {
 Console.WriteLine($"Hello {name}");
};

效果都是一样的

委托也可以定义为泛型,除了delegate其他都与声明方法(函数)无异

public delegate bool Compare<T1,T2>(T1 t1,T2 t2);

对委托最常使用的方法是 Invoke() 和 BeginInvoke() / EndInvoke()
Invoke() 会调用赋值给委托的所有方法
直接调用也是全部方法都调用say()

要注意的是除了第一次赋值其他都要用+=的方式赋值,否则后面的会覆盖掉前面的

最终结果输出   "不想打招呼"
//第一次赋值
SayHello say = name => {
	Console.WriteLine($"你好 {name}");
};
//还是用 = 号赋值
say = MyFunc;
say = _ => { 
 Console.WriteLine("不想打招呼");
};
say("Tom");
//say.Invoke("Tom");
最终输出 :
{
    你好 Tom
    Hello Tom
    不想打招
}
//第一次赋值
SayHello say = name => {
	Console.WriteLine($"你好 {name}");
};
say += MyFunc;
say += _ => { 
 Console.WriteLine("不想打招呼");
};
say("Tom");
//say.Invoke("Tom");

还有就是可以使用 -= 移除方法

SayHello say = name => {
	Console.WriteLine($"你好 {name}");
};
say += MyFunc;
say += _ => { 
 Console.WriteLine("不想打招呼");
};

//移除MyFunc,这样最后就不会输出 Hello Tom 了
say-=MyFunc;

say("Tom");

官方提供的定义好的委托

1.Action:没有返回值,返回值为void
2.Func:有返回值,泛型的最后一个参数为返回值类型,
比如:Func<string,int> 或 Func int 就是方法的返回值
3.Predicate 返回值为 bool

事件 Event

事件是跟委托结合使用的,事件基于委托,而且是多播委托
定义一个事件的语法就是 event +委托(定义好的委托)+变量名(随便取,不过最好规范点)

	public event SayHello OnSayHello;

和委托不一样事件只能通过+= 和 -= 添加和移除方法
所有添加(订阅了OnSayHello)的方法在事件调用(触发)的时候都会收到通知,
也就是被调用

OnSayHello += Program_OnSayHello;
OnSayHello += s => {
	Console.WriteLine($"张三听到有人在叫{s}");
};
OnSayHello += _ => { Console.WriteLine("有人在招呼?"); };
//OnSayHello("Tom");
OnSayHello.Invoke("Tom");

private static void Program_OnSayHello(string name)
	{
		Console.WriteLine($"有人在跟{name}招呼");
	}
	
//最终输出
有人在跟Tom招呼
张三听到有人在叫Tom
有人在招呼?	

区别委托和事件

我们发现委托跟事件 好像很像,但还是要根据不同的情况选择。
更多

C#委托和事件之间的区别如下:

  1. 委托是一个包含一个或多个方法引用的对象,它可以在程序中传递和调用方法。而事件是一个特殊类型的委托,它只能在定义它的类中触发,并且它通常用于实现观察者模式。

  2. 委托可以在程序中的任何地方调用,而事件只能在定义事件的类中触发。

  3. 委托可以被任何方法调用,而事件只能由一个或多个特定的方法注册和调用。

  4. 委托可以使用“+”和“-”运算符来添加和移除方法,而事件只能使用“+=”和“-=”运算符来添加和移除事件处理程序。

  5. 委托可以直接调用方法,而事件必须在事件处理程序中被触发。

标签:Console,复习,委托,C#,say,WriteLine,Tom,name
From: https://www.cnblogs.com/ChuanC/p/17598850.html

相关文章

  • C语言
    程序设计和C语言C语言的特点C语言语句简洁紧凑使用方便灵活运算符丰富表达能力强//c语言只有32个关键字34种运算符C语言程序可移植性好//C语言中没有直接依赖硬件的语句与硬件有关的操作如数据的输入、输出都是都是调用系统提供的库函数//来实现的而这些库函数本身并......
  • JavaWeb和MVC三层架构
    JavaWeb概述网站发布和部署一定要依托技术语言吗:不一定,一个网站可以直接发布和部署,因为因为浏览器能够识别网页只需要两样东西,网络和静态页面,还有一个装在他们的容器,比如nginx。静态页面面临的问题:1:静态网页是固定的,是不可变的。如果一个网站比如腾讯首页,这里需要1000文......
  • DPC WATCHDOG VIOLATION
    蓝屏SmbCo10X64.syshttps://answers.microsoft.com/zh-hans/windows/forum/all/%e6%9c%80%e8%bf%91%e7%94%b5%e8%84%91%e6%80%bb/d228ea4b-3945-4b1c-8c98-b1b3823d0213https://answers.microsoft.com/zh-hans/windows/forum/windows_11-windows_install/%e8%93%9d%e5%b1%8f/......
  • vs编译 error C2001: 常量中有换行符(XTHS实测有效)
    出现该错误的其中一种可能:编码问题,其中一个解决办法是:找到这个文件位置,选择用Notepad++方式打开,选择菜单项中的"编码"---》“使用UTF-8-BOM编码”,然后保存,再回到VS将会收到重新加载文件的提示。 转自:vs编译errorC2001:常量中有换行符_简单前行的博客-CSDN博客......
  • k8s Service Accounts
    ServiceAccounts介绍服务帐户是一种非人类帐户,在Kubernetes中,它在Kubernetes集群中提供独特的身份。应用程序Pod、系统组件以及集群内部和外部的实体可以使用特定ServiceAccount的凭据来标识该ServiceAccount。此身份在各种情况下都很有用,包括向API服务器进行身份验......
  • AIGC学习-1
    挖坑,闲的没事可以去部署这个项目玩玩:AI入门必修,跟着阿里云专家搭建文生图应用(aliyun.com)玩转AIGC|使用阿里云NAS+PAI-EAS部署StableDiffusion文生图模型-阿里云开发者社区(aliyun.com)......
  • 解决在macOS系统上使用rust-gdb调式rust代码时无法进入断点的问题
        问题title缩写,主要原因是gdb无法在cargo生成可执行文件和符号信息关联起来,类型信息如下图:  解决方案:在Cargo.toml文件中添加一项配置,所以能找到符号信息. 配置信息说明:1. profile.dev或者profile.release是用cargobuild进行编译时使用到的配置......
  • ConstraintLayout(约束布局)
    1.规则layout_constraintLeft_toLeftOf当前View的右侧和另一个View的右侧位置对齐与RelativeLayout的alignLeft属性相似layout_constraintLeft_toRightOf当前view的左侧会在另一个View的右侧位置与RelativeLayout的toRightOf属性相似layout_constraintRight_toLeftOf当......
  • Educational Codeforces Round 152 (Rated for Div. 2) D. Array Painting
    初始所有点都是蓝色的,给定一个数组,每个元素为0,1,2等值,两种操作,选定一个点花1元变红,或者选定一个为1或者2的红色点,减去一个价值,让周围的点变红,最后所有点都要变红思路:贪心,对于一个数组来说我们找寻连续的不等于0的一段,判断每一段最多所能变红的存在两种情况010,这种情况花1可以最......
  • 电商curl编码请求,抓取天猫商品页面
    请求参数请求参数:num_iid=652874751412&is_promotion=1参数说明:num_iid:商品IDis_promotion:是否获取取促销价请求示例 测试入口 CurlPHPPHPsdkJAVAC#Pythoncurl-i"https://api-gw.onebound.cn/taobao/item_get/?key=<您自己的apiKey>&secret=<您自己的apiSecret>&num_iid......