理解C#委托(Delegate)通俗易懂,深入浅出

这篇具有很好参考价值的文章主要介绍了理解C#委托(Delegate)通俗易懂,深入浅出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

委托是什么?

委托首先是一个数据类型,我们可以像定义结构体一样定义一个委托类型,委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变

委托的定义

//语法
delegate <return type> <delegate-name> <parameter list>
//实例
public delegate int MyDelegate (string s);

实例化委托(Delegate)

例如:

public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);

说白了就是类似指向函数方法的指针,我们可以类似定义指针类型一样,定义委托的类型

在定义委托类型时要指定函数的参数类型和返回值,一旦声明了委托类型,委托对象必须使用 new 关键字来创建,且与一个特定的方法有关。当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。

简单用法实例

using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         // 创建委托实例
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         // 使用委托对象调用方法
         nc1(25);
         Console.WriteLine("Value of Num: {0}", getNum());
         nc2(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

这只是简单的用法介绍,可以看出 这和在主程序里直接调用方法没啥区别,并不是实际的用法。

委托的用途

多播

委托对象可使用 “+” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。

使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。下面的程序演示了委托的多播

static void Main(string[] args)
      {
         // 创建委托实例
         NumberChanger nc;
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         nc = nc1;
         nc += nc2;
         // 调用多播
         nc(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

关键: 委托的使用场景

委托,故名思意,咱们用一个形象的比喻,公司里 ,老板/调用者 ,可以不用委托我/激活委托函数,亲自去给张三/func1,李四/func2 安排工作,就是直接调用,这时或许要准备调用的参数和调用方式的代码 比如循环调用,
老板/调用者 还可以通过我/激活委托的函数 去安排张三李四的工作,同时也可以指定张三/func1,李四/func2 一起工作/±多播,也可以拓展新的员工/方法。
和类的继承多态有异曲同工之妙,不过更加灵活,我/激活委托函数 不需要知道自己要调用什么函数以及具体实现,只管用调用者给的参数就行了 ,父类不用管子类如何实现的,通过子类型的赋值,就能调用子类重写的方法。


        //委托

        // 委托声明
        public delegate void doSomething(string s);
		//定义 回调函数  ,公司里的员工 张三,李四.............
		public static void ZangSan(string a) {
			Console.WriteLine("zhangsan"+a);
		}
        public static void LiSi(string a)
        {
            Console.WriteLine("lisi"+a);
        }
        /// <summary>
        /// 中介,委托处理 ,使用此方法触发委托回调
        /// </summary>
        /// <param name="from">开始</param>
        /// <param name="to">结束</param>
        /// <param name="fb">委托引用</param>      
            private static void handleDelegate(int from, int to, doSomething ds)
            {
			//一些预处理 ,这样使用委托就比直接调用方便了
                for (int val = from; val <= to; val++)
                {
                 
                    if (ds != null)
                    {
                        ds(val.ToString());
                    }
                    //ds?.Invoke(val); 简化版本调用
                }
            }
        

        //主函数,调用者 老板
        public void testDelegate()
        {     //老板通过我/中介 给张三安排工作,
			doSomething dsZhangSan = new doSomething(ZangSan);
			//给张三李四 按顺序安排工作  //按序执行
			doSomething dsLisi = new doSomething(LiSi);
			doSomething ds = dsZhangSan + dsLisi;
			//在调用的时可以给张三,李四传参数,这里在handleDelegate里面给了 ds(val.ToString());
			handleDelegate(0, 3, ds);

			//方法的返回值,参数必须完全一样,符合委托类型的定义
		}

执行结构

理解C#委托(Delegate)通俗易懂,深入浅出

回调函数的机制

把我想象成是独立的提供服务的中介,而老板/函数实现的一方, 张三/func1,李四/func2 ~~~是一个公司的,合作时,老板指定张三或是李四… , 而我不需要关心,我只是在特点条件发生时去调用张三李四就行了文章来源地址https://www.toymoban.com/news/detail-432912.html

⑴定义一个回调函数;
⑵提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
⑶当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

到了这里,关于理解C#委托(Delegate)通俗易懂,深入浅出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 建造者模式深入理解:演示建造单个和多个产品的实践,结合模板模式,通俗易懂

    建造者模式深入理解:演示建造单个和多个产品的实践,结合模板模式,通俗易懂

    首先呢看下建造者的定义是什么样的,先读一遍 建造者模式 (Builder Pattern)是一种创建型设计模式,它主要用于将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表现形式。这种模式通过一系列可重用的独立的类(称为建造者或构建器)来一

    2024年01月22日
    浏览(10)
  • C#中的委托(Delegate)和事件 (Event)详解与使用范例

    最近天气晴雨不定,你因为害怕打游戏时忘记在下雨时收衣服或者在天晴时把衣服挂出去,于是你委托好友小明在天气发生变化时打电话通知你,这就是一种委托. 下面是这种委托的实例代码 以上代码的输出为 值得一提的是,如下代码为创建一个继承自Delegate类的名为XiaoMing的子类

    2023年04月12日
    浏览(5)
  • 面试常考:C# 委托(delegate、Action、Func、predicate)和事件

    刚开始工作的时候,觉得委托和事件有些神秘,而当你理解他们之后,也觉得好像没有想象中的那么难,这篇博文算是自己对委托和事件的一次梳理和总结。 C#中的委托,相当于C++中的指针函数,但委托是面向对象的,是安全的,是一个特殊的类,当然他也是引用类型,委托

    2024年02月16日
    浏览(11)
  • MVCC详解,深入浅出简单易懂

    MVCC详解,深入浅出简单易懂

    一、什么是MVCC? mvcc,也就是多版本并发控制,是为了在读取数据时不加锁来提高读取效率和并发性的一种手段。 数据库并发有以下几种场景: 读-读:不存在任何问题。 读-写:有线程安全问题,可能出现脏读、幻读、不可重复读。 写-写:有线程安全问题,可能存在更新丢

    2024年02月04日
    浏览(8)
  • 通俗易懂,Spring Bean生命周期管理的理解

    目录 1、实例化阶段 2、初始化阶段 3、销毁阶段 总结 在Spring框架中, Bean是最基本的组件,它是Spring框架中的一个Java对象 。 下面通过@Bean来理解bean的生命周期: 在Spring框架中,@Bean注解用于告诉Spring框架一个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的

    2024年02月21日
    浏览(8)
  • 通俗易懂,unity和c#是什么关系

    通俗易懂,unity和c#是什么关系

    Unity 是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。 Unity平台提供一整套完善的软件解决方案 ,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机

    2024年02月04日
    浏览(7)
  • 通俗易懂 快速理解 JDK动态代理 和 cglib动态代理

    通俗易懂 快速理解 JDK动态代理 和 cglib动态代理

    动态代理的实现方案有两种, JDK动态代理 和 CGLIB动态代理 ,区别在于JDK自带的动态代理,必须要有接口,而CGLIB动态代理有没有接口都可以。 JDK动态代理 :JDK原生的实现方式,需要被代理的目标类必须实现接口。因为这个技术要求 代理对象和目标对象实现同样的接口 (兄

    2024年02月08日
    浏览(6)
  • python类(class)的定义、使用、继承、应用的通俗易懂理解

    1.为什么使用类         一个类(class)可以包囊众多函数,所以一般使用类的情况下,都需要用到众多有共性的函数,把这些可能会一起调用的函数或者需要接连调用的函数归为一个类,这样需要使用的时候可以轻易的找到。         在处理不同细节时使用的类区别

    2024年02月22日
    浏览(8)
  • Kotlin委托Delegate托管by

    property=\\\'user\\\' setValue - fly property=\\\'user\\\' getValue fly 0 - 2023 2023 - 2024 Delegates.observable追踪观察可变数据更新,Kotlin_zhangphil的博客-CSDN博客 **Java观察者模式的场景:一个女孩洗澡,被很多男孩偷看。女孩洞察后,搜索坏男孩,然后继续洗澡。*//*男孩Boy.java*/import java.util.Observable;不定长

    2024年02月09日
    浏览(7)
  • Linux 权限-+完整思维导图+实图例子+深入细节+通俗易懂建议收藏

    Linux 权限-+完整思维导图+实图例子+深入细节+通俗易懂建议收藏

            当时间的主人,命运的主宰,灵魂的舵手。上一回已将基础权限全部学习完了,本章开始我们将进入到权限的学习。 话不多说安全带系好,发车啦 (建议电脑观看) 。 附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗

    2024年02月06日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包