首页 > 其他分享 >第23篇 委托的概述

第23篇 委托的概述

时间:2024-09-23 09:51:57浏览次数:9  
标签:委托 23 Action 概述 action 方法 public ShowDelegate

什么是委托?

委托可以说是把一个方法代入另一个方法执行,相当于指向函数的指针;事件就相当于保存委托的数组;

1.实例化委托的方式:

方式1:通过new创建实例:

public delegate void ShowDelegate(); 或者 public delegate string ShowDelegate(string str);
ShowDelegate d = new ShowDelegate();

方式2:使用赋值的方式:

ShowDelegate s = test.show;

方式3:匿名委托

ShowDelegate s = delegate(){ console.WriteLine("匿名委托");}

2.使用委托

方式1:直接调用委托的变量,如:showDelegate("s",1);
方式2:invoke(),如showDelegate.invoke("s",2); //执行方法,如果委托定义没有参数,则invoke也没有参数,委托没有返回值,则invoke也没有返回值;
//BeginInvoke,开启一个线程去执行委托,netCore不支持,netframeWork支持,NetCore有更好的多线程功能来支持;

3.多播委托(委托链)

1)委托都是继承自MulicastDelegate(多播委托),定义的委托基本上都是多播委托;
2)可以通过+=把多个方法添加到这个委托中,形成一个执行链,按照添加的先后顺序依次执行;
3)可以通过-=把加入到委托的方法注销,
4)action.BeginInvoke()会开启一个新的线程去执行委托,注册多个委托时,不能使用beginInvoke()去执行;
5)注册有多个方法的委托想要开启新线程去执行委托,可以通过action.GetInvocationList()获取到所有的委托,然后循环执行,每个方法执行都可以用BeginInvoke;

4.多播委托使用的问题:

1)使用时,委托链的第一个方法报错了,导致后面注册的方法都是无法调用的,
解决方法:使用GetInvocationList按照调用顺序返回此多播委托调用的列表;

2)当委托链上,注册的都是有返回值的方法时,如果调用委托,那么只会返回最后一个注册的方法的返回值;

5.委托判断

在使用Invoke的时候:判断调用的委托是否为空,如果为空,不执行,不为空执行;
Delegate s = Show;
s -=Show;
s?.Invoke();

6.为什么使用委托:

1)委托时一种引用类型,表示对具体特定参数列表和返回类型的方法的引用,与C或者C++中的函数指针不同,
委托是一种面向对象,并且是类型安全的;
2)委托可以实现代码的重用,逻辑解耦,在方便代码维护的同时,方法声明和方法实现分离,也可提升程序的可扩展性;

7.泛型委托:与普通委托一样

public delegate void ShowDelegate<T,S>(T t,S s);

C#2.0提供了Action和Func两个泛型委托,不用申明,直接可用;

1)Action

public class ActionTest{
public Action Action;
public void SendMsg(){
	console.writeline("消息发送完成!");
}

public void Test(){
//实例化方式有四种:
action = SendMsg;
action = new Action(SendMsg);
action = delegate(){
 console.writeLine("delegate方式")  //C#2.0提出用匿名函数代替;
}
action = ()=>{
console.writeLine("lambda 匿名方法") //C#3.0提出用lamda表达式写
}
action();
action.Invoke();
}

}

2)Func与Action写法类似;

8.什么是事件

1)事件是基于委托的,为委托提供一个订阅或发布的机制,是一种特殊的委托,调用事件和委托是一样;
public event DoDelegate DoEvent;

9.委托与事件的区别?

1)事件只能在方法的外部进行声明,而委托内外部都可以;
2)事件只能在类的内部进行触发,不能在类的外部进行触发,而委托在类的内外部都可以触发;
3)委托一般是用于回调,而事件一般是用于外部接口;

标签:委托,23,Action,概述,action,方法,public,ShowDelegate
From: https://www.cnblogs.com/chenshibao/p/18426358

相关文章

  • CF1239E Turtle 题解
    Description一只乌龟从\(2\timesn\)的棋盘的左上角走到右下角,只能往下或往右,需要给出一种方案来分配\(2n\)个数字使得乌龟走过的路径上的数之和的最大值最小。\(2\leqn\leq25,0\leqa_{1,i},a_{2,i}\leq5\times10^4\)。Solution设\(pre_{i}=\sum_{j=1}^{i}{a_{1,i}......
  • 数据结构之线性表——LeetCode:82. 删除排序链表中的重复元素 II,21. 合并两个有序链
    82.删除排序链表中的重复元素II题目描述82.删除排序链表中的重复元素II给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。运行代码classSolution{public:ListNode*deleteDuplicates(ListNode......
  • 2376.统计特殊整数
    如果一个正整数每一个数位都是互不相同的,我们称它是特殊整数。给你一个正整数n,请你返回区间[1,n]之间特殊整数的数目。示例1:输入:n=20输出:19解释:1到20之间所有整数除了11以外都是特殊整数。所以总共有19个特殊整数。示例2:输入:n=5输出:5解释:1到5......
  • Stack Overflow 2023 年开发者调查报告!
    StackOverflow发布了2023年开发者调查报告,据称共计超过9万名开发者参与了此次调查。完整报告包含了受访开发者画像,以及关于开发技术、AI、职业、社区等方面的内容。本文主要介绍关于开发技术和AI的部分。懒人目录:最流行编程语言:JavaScript最“赚钱”编程语言......
  • 基于Spring Boot的疫苗接种系统 计算机专业毕业设计源码32315
    摘 要预防预接种工作实行网络信息化管理,是我国免疫规划工作发展的需要。接种信息实行网络信息化不仅是预防接种工作步入了一个新的台阶,更重要的是解决了多年疫苗接种过程种,免疫接种剂次不清,难以全程有效接种的问题;同时各级政府卫生行政部门亦能通过平台可以及时了解本地区免......
  • 【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解
    【洛谷】P10417[蓝桥杯2023国A]第K小的和的题解题目传送门题解CSP-S1补全程序,致敬全A的答案,和神奇的预言家。写一下这篇的题解说不定能加CSP2024的RP代码#include<bits/stdc++.h>#definelowbit(x)x&(-x)#defineendl"\n"usingnamespacestd......
  • 微服务技术(一)概述
    微服务技术的重要性目前各大电商平台,国企,事业单位,银行,都在建立高并发稳定的信息系统,基本都在使用微服务框架技术作为架构。已经不是趋势,而是实实在在用到的技术,标书里明确要求要使用云平台,微服务技术。应聘去做单机版系统的程序员工资一般不会高JAVA工程师拿到高薪必须掌握的......
  • c#代码介绍23种设计模式_03工厂模式
    目录1.工厂方法模式之所以可以解决简单工厂的模式2.使用工厂方法实现的系统,如果系统需要添加新产品时3.从UML图来看4、实现思路1.工厂方法模式之所以可以解决简单工厂的模式是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出......
  • 【配置管理】1、配置管理概述
      随着现代软件技术的发展,对于软件项目的需求日益复杂而且变更频繁,项目的开发模式已经由昔日的手工作坊式的开发转变为规模化、团队式的开发,当开发团队发展到一定规模时,会越来越强调开发过程规范化和成熟度。软件项目的成败在很大程度上取决于对其开发过程的控制,这包括对......
  • 阅读周·你不知道的JavaScript | 行为委托,搞懂对象之间的关系
    背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读两个月。《你不知道的JavaScr......