Delegate: What is this? ----什么是Delegate(委托)

UE4之Delegate:动态单播 定义 #define FUNC_CONCAT( ... ) __VA_ARGS__ #define DECLARE_DYNAMIC_DELEGATE( DelegateName ) BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_DELEGATE) FUNC_DECLARE_DYNAMIC_DELEGATE( FWeakObjectPtr, Dele... 阅读详情

为什么要写这篇文章

  • 首先,想找个借口说英语很难,但是,我将尽可能的让这篇文章通俗易懂。

    其次,我想解释一下我写这篇文章的原因。一段时间以前,我和一个朋友讨论过一个问题,他当时正在学习C#,他让我给他解释一下delegates和events。 当时,我非常地吃惊。 现在有那么多的C#书籍,有用的链接,sample源代码等等。但在讨论的过程中,我意识到他已经读过C#编程的书,浏览过很多有用的网络资源,也研究过一些好的代码实例, 但是对于理解delegates来说还是有不少的问题。

    这个代码实例就是我们讨论的结果。这个例子非常地简单,也可以说,非常地无聊。但是,他让我的那位朋友理解了delegates的实质。我希望这个例子以及其中的注释对于其他正在学习C#的朋友也有用。

    正文开始

    我建议你在阅读这篇文章前先下载下来这个demo(演示)项目。是一个C#控制台应用程序。解压缩后,用.NET Studio打开那个.sln文件.

    C# delegate 是一个callback函数。 换言之,delegate是class-server向class-client提供反馈的一种方式。

    C# 的delegate要比一般的(标准的)callback函数更加的灵活,因为它允许你定义一系列(strict list)可以从class-server端到class-client端的参数。

    在我们的这个例子中,class-server有一个名字DataHolder。它包含了一个数据集合。而数据项在DataItem类中进行的定义,每一个数据都有两个属性:Name和Color。而DataHoder类包含一个允许遍历查找数据集合以便找到符合搜索条件数据的方法。这个方法有两个参数,第一个参数定义了搜索的条件,第二个参数定义了一个当符合搜索条件时可以调用的方法。

    正确的理解class-server端遍历所有的数据(from the start to the end)是非常重要的。如果数据项符合搜索条件,那么class-server端就调用一个class-client端定义的方法。返回数目也就和符合搜索条件的那些数据项目数目相同。

    MainClass即是class-client.第一句话就创建了一个DataHolder类的实例(1st),然后创建了CallBack类型逆光的delegate实例。这个delegate实例(procedure01) 包含了下面的信息:用户自定义的class-server段要在class-client端调用的方法(PrintSearchResult),并且class-server必须把这些参数传递给这个用户定义的参数.而传递的这个参数,是在delegate声明中定义的。

    以上就是C# delegate的主要思想。我建议你把这段代码在编译器中执行一遍看看他的执行结果。

    ===================================
    部分代码:

     

    class DataItem
      {
       
    private string m_ObjectName;
       
    private string m_Color;
     
       
    public DataItem(string Name, string Color)
       {
        m_ObjectName 
    = Name;
        m_Color 
    = Color;
      }

      
    public string Name
      {
    get {return m_ObjectName;}}
      
      
    public string Color
      {
    get {return m_Color;}}

     }
    //Class Item

     
    /**//*This is declaration of new data type "CallBack" which is based
      * on C# data type "delegate"
    */
     
    public delegate void CallBack(string s);


     
    /**//*This class represents collection of data items.*/
     
    class DataHolder
     {
      
    private ArrayList m_List;

      
    public DataHolder()
      {
       m_List 
    = new ArrayList();
       m_List.Add(
    new DataItem("Desk", "Black"));
       m_List.Add(
    new DataItem("Car", "Red"));
       m_List.Add(
    new DataItem("Train", "Yellow"));
       m_List.Add(
    new DataItem("Tomato", "Red"));
       m_List.Add(
    new DataItem("Cheese", "Yellow"));
       m_List.Add(
    new DataItem("Computer","Grey"));
       m_List.Add(
    new DataItem("Sausage", "Red"));
       m_List.Add(
    new DataItem("Cat", "Black"));
      }

      
    /**//* this method provides search functionality for caller. When an item 
       * meets search condition is found, client defined procedure activates.
    */
      
    public void SearchData(string SearchCondition, CallBack ClientDefinedProcedure)
      {
       
    foreach (DataItem i in this.m_List)
       {
        
    if (i.Color == SearchCondition)
        {
         ClientDefinedProcedure(i.Name);
        }
       }
      }
     }
    //Class DataHolder

     
    class MainClass
     {
      [STAThread]
      
    static void Main(string[] args)
      {
       
    /**//*Create list of Data Items*/
       DataHolder lst 
    = new DataHolder();

       
    /**//* Cteate instance of delegate with type CallBack and bind it
        * to user defined procedure PrintSearchResults()
    */
       CallBack procedure01 
    = new CallBack(PrintSearchResult);
       
       Console.WriteLine(
    "Red color objects:");
       
    /**//*Call search method with search critheria "Red" and user defined
        * procedure which is nesessary to execute when data item meets to search
        * creteria is found.
    */
       lst.SearchData(
    "Red", procedure01);
       Console.WriteLine(
    "---------------");
       Console.ReadLine();

      }

      
    /**//*This procedure is called by DataHolder any time when data item meets to search
       * criteria is found.
    */
      
    private static void PrintSearchResult(string s)
      {
       Console.WriteLine(s);
      }
     }
    //MainClass
    输出的结果是
    Red color objects:
    Car
    Tomato
    Sausage
    -------------
      
c# .net 委托delegate 概述 1 委托的声明、实例化和调用 2 委托的意义:解耦 3 泛型委托--Func Action 委托也是无处不在 Func Action 异步多线程 事件 如果需要定义委托 就用Func Action Framework1.0 ----4.7 Core到处都是委托 一、委托声明 1.必须用 修饰关键词delegate 2.用关键词delegate修饰后的,在VS里TA的着... 阅读详情

相关推荐

c# .net 委托delegate--高级篇

前言 Action和Func是.NetFramework3.0出现的 Action系统提供 0到16个泛型参数 不带返回值 委托 Func系统提供 0到16个泛型参数 带泛型返回值 委托 准备代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Delegate_Advanced ...

橙-极纪元-JJYCheng 700

Java代理

     代理模式,是GOF中的一种;此模式中主要有client(调用者),proxy(代理),delegate(原对象、委托对象);client不是对delegate发请求,而是对proxy发请求,proxy内部将责任委托给delegate。一般proxy将一些复杂的操作封装起来,使client可以透明地调用delegate的方法,而无须知道proxy内部的实现细节。         

星星的技术专栏 815

Lumerical-定向耦合器1

概述:本文章使用FDE求解器对定向耦合器进行了数值仿真,讨论了耦合器的间距相关性,耦合长度相关性,波长相关性。讨论了脊形波导和条形波导两种情况。

m0_61776728的博客 4614

Lombok:@Delegate优化代码利器

Delegate可以让你的类使用其他类的方法,而不需要自己写代码每天进步一点点!

ql_gome的博客 1416

Windows沙盒神器Sandboxie Plus保姆级教程:从安装到实战测试可疑软件

本文详细介绍了Windows沙盒神器Sandboxie Plus的安装、配置与实战应用,帮助用户安全测试可疑软件。从系统要求、安装步骤到核心功能如多沙盒管理、文件共享和快照恢复,全面解析了这款轻量级沙盒工具的优势与使用技巧,特别适合需要隔离运行未知程序的用户。

weixin_29323049的博客 1155

程序员的自我修养

一个好的程序员的自我修养需要从不同角度出发,工作能力是一个方面,对自身的定位和了解也是一个方面,程序员的工作能力修养包括需求理解、功能设计、沟通确认、代码规范、成果验证、代码重构优化等,通过自我剖析来对自身进行定位并了解自身的优缺点,如去除劣根性、端正意识形态与态度、提升自己的核心竞争力等。 自我剖析 一个成功的人,必须要先了解自己,只有了解自己是什么样的人,了解自身有哪些优缺点,了解自己更合适做什么工作,知道自己做什么才能发挥出自身的优势,这样才能使自己在工作中发光发热,在职业生涯的道路上走的更远。

数通畅联 1676

C# 委托使用详解

C# 委托使用详解

鲤籽鲲的博客 3086

浅谈MOS管的发热原因和解决办法

解读一下开关管发热原因,解决方案和开关损耗测试。

qq_45508321的博客 1万+

甭管什么登录都给你接入到项目中去

上次我们把验证码登录、小程序登录优雅地集成到了Spring Security,很多同学大呼过瘾,相比较一些传统玩法高级了很多。胖哥就赶紧抓住机会举一反三,把微信、企业微信的三方登录也优雅地接了进来。只需要通过下面几行简单的代码就可以完成集成:@Bean DelegateClientRegistrationRepositorydelegateClientRegis...

码农小胖哥 1022

从零开始:手把手教你检查并更新英伟达GPU驱动和CUDA版本(Windows/Linux双平台)

本文详细指导如何在Windows和Linux系统上检查并更新英伟达GPU驱动和CUDA版本,解决版本不匹配导致的常见问题。涵盖驱动更新、CUDA Toolkit安装、版本冲突排解及性能优化技巧,帮助开发者高效管理GPU计算环境。

weixin_29237635的博客 701

Android14 SystemUI如何实现下拉菜单栏高斯模糊背景效果(类似于毛玻璃效果)

我们都知道,从Android12起,下拉菜单栏控制中心都是黑色的,看起来非常不美观,而且国内的手机系统UI都做的比较美观,大部分的下拉菜单UI背景都是实现了高斯模糊效果,所以客户也会要求实现类似于这样的效果。在以前的Android项目中,实现下拉菜单栏的模糊背景就是通过截图的方式进行替换背景,而这种方式下拉菜单背景极易替换不了,就算是在各个地方都适配,还是有概率在复杂场景或者一些测试手法下出现背景是黑的情况,并且这种方式还比较影响性能,毕竟每次都要去截图一次,多做了额外的事。

热衷于Android Framework和系统APP的修改经验分享 1793

委托 delegate

一、delegate 基础 1、基本简介 委托是一种类型,该类型可以赋值一个函数的引用。即,委托是把一个函数当作参数来进行传递。其作用类似于C++中的函数指针,是一种函数指针的升级版,类似于自己不做,委托给别人来做的情况。 它是和类(class)具有同等地位的,所以其声明一般是位于命名空间namespace下、且位于类外部。(委托也可以声明在类的内部,此时其相当于类的嵌套类型。如同在一个类的内部,声明另一个类一样) 委托和类的用法相同,都是需要先声明,再实例化,只是实例化之后仍然叫委托。 委托的声明和函数

Jeffxu_lib的博客 830

【第一章】核心思维:那个在此刻“消失”的 CPU

摘要:RTOS本质是"有状态的抢占"而非"多任务",单核MCU通过时间片分时复用实现任务切换。裸机编程的线性思维在RTOS中不再适用,开发者需接受代码随时被打断的现实。RTOS通过保存/恢复CPU寄存器组(上下文)实现任务切换,每个任务拥有独立栈空间。非原子操作(如全局变量自增)会导致竞态条件,必须使用临界区或互斥锁保护。RTOS编程需要建立并发思维,关注代码原子性、可重入性和栈空间分配。

一路往蓝-Anbo 的博客 105

关于委托delegate的几点

1.委托delegate一般表达式:delegate return-Type delegateName (parameters) eg: //1.declare a delegate public delegate Tranform(int x); public static int Square(int x) {return x*x}; //2.instaniated dele

qwt19900802的博客 530

别再用第三方黑盒库了!从零手写C#+YOLOv12推理全流程,框位准、可定制、调试快10倍

从零手写YOLO推理框架,不是为了造轮子,而是为了完全掌控代码,工业现场的需求千变万化,第三方黑盒库根本没法满足所有需求。这套代码我已经在东莞长安的3家PCB厂、深圳南山的2家3C电子厂落地了,稳定运行6个月,没有出过任何问题。如果有什么问题或者需要扩展的功能,都可以在评论区交流。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 326

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C#程序设计 委托(Delegate)入门

委托类型的定义类似于方法签名,但没有方法体,并且以delegate关键字开头。在这个例子中,定义了一个名为SampleDelegate的委托,它可以指向任何返回类型为void并且接受一个string类型参数的方法。

gu20的专栏 671

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# 委托(Delegate)和事件(Event)

C# 委托(Delegate)和事件(Event) 委托:是一个类,继承自System.MulticastDelegate,里面内置了几个方法。 委托可以写在类里面,也可以写在类的外面。 // 委托可以写在类的外面 public delegate void NoReturnNoParaOutClass(); public class MyDelegate { // 也可以写在类里面 public delegate void NoReturnNoPara<T>(T t);

u012577058的博客 439

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# 中this.Invoke(delegate)与delegate.Invoke()区别

委托

SZF 2453

C#中的委托delegate

委托是对函数原型的包装 委托的申明: public delegate double MyDelegate (double x) 委托的实例化: MyDelegated d2 = new MyDelegate(obj.myMethod) 委托的调...

vincent的博客 371

C#中委托delegate的用法

委托是.Net Framework引入的一个新概念,在理解委托的时候,可以把它当做C语言中的函数指针,下面先来回顾一下C语言中函数指针的用法。 下面定义了一个名为p的函数指针,它能指向的函数为返回值是int类型的,并且有两个int类型的参数。 int (*p) (int, int) 下面是一个Demo #include<stdio.h> int Add(int a, int b) {...

学习记录 799

【C#小知识】c#中的delegate(委托)和event(事件)

今天来介绍一下delegate和event。delegate在c#中可以定义一个函数类型,可以将函数作为一个对象来使用。event在c#中则可以看做一个函数的集合,event中包含了一个或多个函数。

Backyard Garden Of Games 1167

关于delegate事件委托怎么用

给每个li添加点击事件,每次点击都要循环遍历一遍,如果有很多li 就会影响性能。 先来看看普通函数怎么实现点击事件 <div class="box"> <ul> <li></li> ...

weixin_30902675的博客 79

委托(Delegate)和事件(Event)-(下篇)

首先需要定义一个委托类型来指定事件处理程序的方法签名。委托定义了可以作为事件处理程序的方法的参数列表和返回值类型。通常情况下,事件处理程序不返回任何值(即返回类型为void),并且接受两个参数:一个是事件源对象 (),另一个是包含事件数据的对象 () 或其派生类。

C6666888的博客 1213
上一篇: C# Interview Questions
下一篇: .net的事件与委托(转载)
浩西
博客等级 码龄19年 47粉丝 48原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值