C#开发学习笔记:委托

Delegate与Action,建议先看为敬 背景 很多C#初学者,都遇到过这样的问题,今天就这个问题,进行分析。 根源 先说下这个问题产生的根源,大家都知道,程序运行起来之后,首先会有一个主线程,主线程用于处理控件生成、界面渲染、事件响应等操作,因此我们可以理解为窗体里的控件是属于主线程的。 如果我们想实现与主线程同时执行另一件事,一般会去使用多线程,因此多线程,从某种意义上来说,它和主线程的身份是平等的,就像你和你的同事的关系一样,你们是平级的关系。如果你同事有一天想从你手上把你的项目程序拿过去,你愿不愿意? 所以,如果在多线程里 阅读详情

 

转载至:https://www.cnblogs.com/akwwl/p/3232679.html

C#委托的介绍(delegate、Action、Func、predicate)

  委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。

  1.委托的声明

  (1). delegate

        delegate我们常用到的一种声明

    Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。

    例:public delegate int MethodtDelegate(int x, int y);表示有两个参数,并返回int型。

  (2). Action

       Action是无返回值的泛型委托。

   Action 表示无参,无返回值的委托

   Action<int,string> 表示有传入参数int,string无返回值的委托

   Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托

       Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托

   Action至少0个参数,至多16个参数,无返回值。

   例:

        public void Test<T>(Action<T> action,T p)
        {
            action(p);
        }

    (3). Func

   Func是有返回值的泛型委托

   Func<int> 表示无参,返回值为int的委托

   Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

   Func<object,string,int> 表示传入参数为object, string 返回值为int的委托

   Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托

   Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

      例:   

        public int Test<T1,T2>(Func<T1,T2,int>func,T1 a,T2 b)
        {
            return func(a, b);
        }

    (4) .predicate

   predicate 是返回bool型的泛型委托

   predicate<int> 表示传入参数为int 返回bool的委托

   Predicate有且只有一个参数,返回值固定为bool

   例:public delegate bool Predicate<T> (T obj)

  

  2.委托的使用

  (1).Delegate的使用  

public delegate int MethodDelegate(int x, int y);
        private static MethodDelegate method;
        static void Main(string[] args)
        {
            method = new MethodDelegate(Add);
            Console.WriteLine(method(10,20));
            Console.ReadKey();
        }

        private static int Add(int x, int y)
        {
            return x + y;
        }

 

  (2).Action的使用   

static void Main(string[] args)
        {
            Test<string>(Action,"Hello World!");
            Test<int>(Action, 1000);
            Test<string>(p => { Console.WriteLine("{0}", p); }, "Hello World");//使用Lambda表达式定义委托
            Console.ReadKey();
        }
        public static void Test<T>(Action<T> action, T p)
        {
            action(p);
        }
        private static void Action(string s)
        {
            Console.WriteLine(s);
        }
        private static void Action(int s)
        {
            Console.WriteLine(s);
        }

 

  可以使用 Action<T1, T2, T3, T4> 委托以参数形式传递方法,而不用显式声明自定义的委托。 封装的方法必须与此委托定义的方法签名相对应。 也就是说,封装的方法必须具有四个均通过值传递给它的参数,并且不能返回值。 (在 C# 中,该方法必须返回 void)通常,这种方法用于执行某个操作。

  (3).Func的使用

 static void Main(string[] args)
        {
            Console.WriteLine(Test<int,int>(Fun,100,200));
            Console.ReadKey();
        }
        public static int Test<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b)
        {
            return func(a, b);
        }
        private static int Fun(int a, int b)
        {
            return a + b;
        }

 

  (4). predicate的使用

  泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。

 static void Main(string[] args)
        {
            Point[] points = { new Point(100, 200), 
            new Point(150, 250), new Point(250, 375), 
            new Point(275, 395), new Point(295, 450) };
            Point first = Array.Find(points, ProductGT10);
            Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
            Console.ReadKey();
        }
        private static bool ProductGT10(Point p)
        {
            if (p.X * p.Y > 100000)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

 

  使用带有 Array.Find 方法的 Predicate 委托搜索 Point 结构的数组。如果 X 和 Y 字段的乘积大于 100,000,此委托表示的方法 ProductGT10 将返回 true。Find 方法为数组的每个元素调用此委托,在符合测试条件的第一个点处停止。

  3.委托的清空

  (1).在类中申明清空委托方法,依次循环去除委托引用。

         方法如下:

     
 public MethodDelegate OnDelegate;                
        public void ClearDelegate()        
        {             
            while (this.OnDelegate != null) 
            {                 
                this.OnDelegate -= this.OnDelegate;  
            }        
        } 

 

  (2).如果在类中没有申明清空委托的方法,我们可以利用GetInvocationList查询出委托引用,然后进行去除。  

  方法如下:

public MethodDelegate OnDelegate; 
     static void Main(string[] args)
        {
            Program test = new Program();

            if (test.OnDelegate != null) 
            { 
                System.Delegate[] dels = test.OnDelegate.GetInvocationList(); 
                for (int i = 0; i < dels.Length; i++) 
                {
                    test.OnDelegate -= dels[i] as MethodDelegate;
                }
            }
        }

 

  4.委托的特点

  委托类似于 C++ 函数指针,但它们是类型安全的。
  委托允许将方法作为参数进行传递。
  委托可用于定义回调方法。
  委托可以链接在一起;例如,可以对一个事件调用多个方法。
  方法不必与委托签名完全匹配。

  5.总结:

    Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型

  Func可以接受0个至16个传入参数,必须具有返回值

  Action可以接受0个至16个传入参数,无返回值

  Predicate只能接受一个传入参数,返回值为bool类型

C# 委托简述 使用关键字delegate声明委托除了使用delegate定义 委托以外C#提供两个定义好的泛型委托Action与Func) (当然你也可以使用delegate自定义泛型委托)这里先介绍两个C#定义的委托,相信很多人都在使用,不管你清不清楚什么是委托Action:是无返回值的泛型委托。下面action 表示无参,无返回值的委托//定义委托action();//使用方式1//使用方式2Console.WriteLine("我是传入的无参无返回值的委托方法"); 阅读详情

相关推荐

c# 委托 关键字:Delegate 学习笔记

生活中是不是经常需要拜托别人帮忙做一件事情? 比如:工作中,客户反馈系统有一个bug,但是你手头上还有很多工作没做完,就需要拜托有时间的同事帮忙解决一下 这就是委托了 定义委托(就是我现在有一个改bug的工作要处理)——声明一个和委托类型一模一样的方法(拜托同事帮忙改bug)—— 执行委托(同事接受我的委托,开始处理bug)注意:委托类型和方法类型必须是一样的,因为要处理同样类型的事情,否...

狸妞儿耳的博客 1369

C# For Unity系列之进阶篇

“中级/进阶篇”讲解特点与内容:         本“中级”与“进阶”篇, 是面向初中级游戏研发人员,以及Unity中高级学习者。为了更加深入的刨析各个语法的本质,我们采用反编译解读IL中间语言的方式,来解构语法重点与难点。 中级篇内容主要讲解: .Net 框架、里氏替换原则(LSP)、类的属性极其本质特性、IS ,AS 关键字、字符串的“驻留性” 原理、深入解析Equals() 原理、枚举类型、自定义集合、深入解析动态集合特性与内部原理、泛型集合、泛型约束、初级委托与事件讲解等。 进阶篇是在中级篇的基础之上,进一步研究与讲解关于IO操作、序列化、正则表达式、系统委托(Action、Function、Predicate等)、反射原理与特性、Linq查询表达式、多线程、线程池、任务、Socket套接字编程(Tcp与UDP协议),以及最后使用Unity开发具备实战价值的通讯聊天程序等。C#“进阶篇”教学详细说明如下:1: IO操作与序列化      学习文件、目录、二进制文件、文本文件的读取与写入底层原理。学习文件序列化与反序列化技能。2: 正则表达式      学习正则表达式的强大作用与常用原字符的含义与应用场景。3: 深入委托与事件      学习Action、Func、Predicate 系统内置委托类型,已经适用场合。学习匿名方法、Lambda表达式。深入解析委托与事件的区别。4: 反射与特性      学习反射的概念与动态调用的重要应用价值,以及Type、Assembley核心类等,最后讲解“特性”技术。5: Linq 查询表达式     学习Linq 查询表达式对于“对象集合”(支持IEnumberable 或IEnumberable) 以及SQL数据库、XML文档方面的强大查询功能。    6: 多线程     学习多线程以及线程传参、线程取得返回数值技术,前台与后台线程、线程的同步、线程池、任务等技术。   7: Socket套接字通讯     学习Socket套接字通讯中,Tcp与UPD通讯协议的不同应用场景,以及各自的演示示例,最后用Unity开发一款实用性的聊天通讯工具。温习提示:           本C# for Unity 使用Virtual Studio2012,以及Unity5.2 进行开发与讲解。(学员使用更高版本,对学习没有任何影响)。      A:《C# For Unity系列之入门篇》https://edu.youkuaiyun.com/course/detail/4560B:《C# For Unity系列之基础篇》https://edu.youkuaiyun.com/course/detail/4595C: 《C# For Unity系列之中级篇》https://edu.youkuaiyun.com/course/detail/24422

C# 高级编程:委托

在 C# 中,委托相当于一个指向方法的安全类型化指针,它本质上是一种特殊的类,编译后会继承自 System.MulticastDelegate。以上代码声明了一个名为 Compute 的委托类型,其方法签名必须接受两个 int 类型参数并返回一个 int。声明、实例化和调用方式,保证方法签名的安全匹配。如何借助委托实现上下层逻辑分离和代码复用。通过 Func 和 Action 简化委托使用,提升代码可读性。委托的异步调用机制为异步编程奠定基础,帮助理解 Task/async 模型的演进。

hy_4377的博客 1165

C#委托的介绍(delegate、Action、Func、predicate)

  委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。   1.委托的声明   (1). delegate         delegate我们常用到的一种声明     Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。     例:public delegate int MethodtDelegate(...

weixin_34329187的博客 1011

C# 委托

在 C# 中,委托(Delegate)是一种类型安全的函数指针,它允许将方法作为参数进行传递,并在不同的上下文中调用这些方法。委托提供了一种灵活的方式来实现事件处理、回调机制和异步编程等功能,极大地增强了 C# 语言的功能性和可扩展性。委托是一种引用类型,它定义了方法的签名。委托可以指向任何具有相同签名的方法。这个委托定义了一个方法签名,该方法接受一个整数参数和一个字符串参数,并且没有返回值。委托是 C# 中一个非常强大的特性,它允许将方法作为参数进行传递,并在不同的上下文中调用这些方法。

2401_83367969的博客 2330

Action vs Func:C#委托双雄,解锁无返回与有值函数式操作的秘密

这里代表最多16个输入参数的类型,且无返回值。这里是输入参数类型,TResult是返回值类型。

java专栏 633

C#之委托

C#中的委托是一个类型,它描述了一个方法的签名,即方法的参数类型和返回类型。委托可以看作是一个指向方法的引用,使得我们可以像使用函数指针一样调用这些方法。 将一个或多个方法作为参数传递给另一个方法,从而在需要时调用这些方法。 实现事件处理程序。 实现回调方法。 实现异步编程等功能。 委托和类一样,是一种用户定义类型。但类表示的是数据和方法的集合,而委托则持有一个或多个方法,以及一系列预定义操作。可以通过一下操作步骤来使用委托。

互联网底层民工的博客 1万+

Unity-利用Action和Func注册事件

利用Action和Func来简化事件的注册过程!!!!!!!!

C#中委托

文章目录一、C#委托二、隐式类型与匿名类型三、C#扩展方法与yield关键字四、Lambda表达式 一、C#委托 举例1: 创建控制台应用程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TheOne { //声明委托 public delegate string Translatio

weixin_46596213的博客 4438

微信自动化进阶:Python识别特定消息并自动回复(基于win32api控件操作)

本文详细介绍了如何使用Python和win32api实现微信消息的智能监控与自动回复。通过精准识别聊天记录中的特定关键词,结合多级匹配策略和性能优化技巧,构建稳定高效的自动化回复系统,适用于企业客服、个人助手等场景。

weixin_42663213的博客 442

晶圆测试(Wafer Sort)的核心技术与良率提升策略

晶圆测试(Wafer Sort)是芯片制造中的关键“入学考试”,通过探针台与自动测试设备(ATE)对晶圆上的芯片进行功能与参数测试,筛选不合格芯片以控制成本。本文深入解析了其核心技术,包括自动化视觉系统对准、测试流程优化策略,并探讨如何利用测试数据驱动良率提升,展望了DFT与AI智能测试的未来趋势。

e4f5g6h的博客 522

C#学习笔记8:接口、委托、事件

今日继续我的C#学习之路,今日学习接口、委托、事件 文章从实践出发学习这三个设计理念,并提供完整源码

NULL指向我的博客 1992

染色体外环状DNA:肿瘤研究新方向

染色体外环状DNA(ecDNA)是癌症中活化原癌基因扩增的主要方式。区别于常染色体,这类生物大分子主要以环状的形式存在于细胞核当中,长度分布在103-106数量级,无中心粒。ecDNA序列中包含一个或者多个基因与调控元件,结构开放,转录活性强,相比于在棒状染色体结构基因,ecDNA的生物功能活性更强。癌症中,成环的基因区域拷贝数往往增高,而超过一半的高拷贝数事件是ecDNA驱动生成。...

blackjimmy的博客 767

C#基础篇——委托

前言 在本章中,主要是借机vb.net教程这个C#基础篇的系列整理过去的学习笔记、归纳总结并更加理解透彻。 在.Net开发中,我们经常会遇到并使用过委托,如果能灵活的掌握并加以使用会使你在编程中游刃有余,然后对于很多接触C#时间 c#教程不长的开发者而言,较好的理解委托和事件并不容易。 本节主要是讲述对委托的定义、委托的使用、多播委托、泛型委托、匿名方法、Func和Action委托、Lambda委托,并对它们进行讨论。 说明 简单说它就是一个能把方法当参数传递的对象,而且还知道怎么调用这个方法,同时也是粒度

chinaherolts2008的博客 2582

Linux之SUSE系统SAP-HANA经常系统内存不足使得SAP应用不能使用解决方案

问题描述 Linux内存使用量超过阈值,使得sap应用程序无可用内存,最终导致程序崩溃。 问题原因 自己查阅了一些资料,也基于zabbix的可用内存和实际不太一样入手去找原因发现问题出现于Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的,而SAP-HANA的日志文件很大...

liuxiangyang_的博客 6712

手把手教你搭建日本亚马逊CVV钓鱼系统(含自动验证功能)

本文详细介绍了电商平台安全防护的关键实践,重点讲解了如何构建自动化风控系统。内容包括基础架构设计、用户行为分析、交易风险评估模型构建、验证机制实现以及系统部署优化,帮助电商平台有效识别和防范安全威胁,同时提升用户体验。

weixin_30952535的博客 818

C#——委托

Action是.NET Framework内置的泛型委托,可以使用Action委托以参数形式传递方法,而不用显示声明自定义的委托。使用多播委托就可以按照顺序调用多个方法,多播委托只能得到调用的最后一个方法的结果,一般我们把多播委托的返回类型声明为void。引用可在运行时被改变。定义了一个委托叫做 IntMethodInvoker ,这个委托可以指向带有一个int类型的参数,并且返回值是void的一个方法。在定义好委托后就可以实例化委托,命名方法委托在实例化委托时必须带入方法的具体名称或者是null。

m0_51743362的博客 1万+

nCode:GlyphWorks案例教程一

nCode GlyphWorks案例一Comparing Frequency Content of Two Different Tests案例文件目标配置选择数据 Comparing Frequency Content of Two Different Tests 在本案例中,我们将比较来自两个不同测试的六个加速计通道的频率内容。将三轴加速度计放置在车辆的左前角和右前角,然后分别在两个不同的试验路面上行驶12分钟以上。 案例文件 此案例的文件(采用nCode DAC格式)位于nCode安装目录下的\demo

追月行的博客 1万+

c#————委托

定义:委托是一种引用类型,存储了对方法的引用,即委托的内部包含一个指向某个方法的指针。委托可以看作是方法的抽象,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。声明:委托的声明类似于变量声明,需要指定委托类型和变量名。委托类型定义了方法的签名,包括返回类型和参数列表。例如,声明了一个名为MyDelegate的委托,它引用了一个返回void类型、带有一个string类型参数的方法。

2401_82978699的博客 1469

手把手教你玩转服务器芯片架构​专栏--​​3.5 实战案例:用SystemC搭建一个多核服务器芯片的NoC模型(含流量分配与延迟仿真)​

通过SystemC搭建多核NoC模型,可深入验证流量分配策略与延迟特性。实际工程中需结合FPGA原型验证(如Xilinx Alveo)进行时序收敛分析,并通过参数化设计适配不同服务器芯片需求。

MHD0815的博客 3047

8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)

8.9华为OD机试真题 新系统 - 查找最佳充电策略 (Java/Py/C/C++/Js/Go)

算法大师! 1172

聊聊 C# 中的委托

委托(Delegate)是C#中的一种类型安全的函数指针,允许将方法作为参数传递或赋值给变量。它主要用于事件处理、回调函数和多播委托等场景。委托的声明类似于方法声明,但不包含方法体。自定义委托在某些特定情况下非常有用,特别是在现有的内置委托(如 Action 和 Func)无法满足需求时,例如方法签名不匹配或需要提高代码可读性和语义清晰性。

ChaITSimpleLove的博客 1465

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【C#进阶】C# 委托

🔘 大家好,我是哈桑。本章为大家介绍 C# 中的委托。委托是一种特殊的引用类型,是用来实现对相同参数列表和返回类型的方法的封装。委托可以将方法作为参数传递给其他方法,也是定义回调方法1的理想选择。

好学若饥,谦卑若愚。 2543

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: AngularJS开发学习笔记:ionic 使用日期选择框ionic-datepicker插件
下一篇: Web开发学习笔记:ngCordova的安装配置
JustWantToFly
博客等级 码龄10年 42粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值