委托

作者: LIKESUNE | 来源:发表于2020-11-13 12:00 被阅读0次

\color{red}{C\#}中我们会听到一个概念——委托。那么委托是个什么鬼,用来干嘛的呢?最近有些空闲时间就写一下\color{red}{C\#}中委托相关的知,识。

开门见山,其实\color{red}{C\#}中的委托是用来实现传递回调函数的。在其他语言中如\color{red}{javascript}中,如果你要往一个函数中传递一个回调函数,让此函数在执行了相应操作后可以调用你传递过去的回调函数。在\color{red}{javascript}中实现这个很简单,只需要把需要回调的函数名传递过去就可以了。

但是,在\color{red}{C\#}中就不一样了。知道\color{red}{C\#}是一门强类型的语言。函数的参数必须要有严格的类型。而且也是不允许直接把函数作为另一个函数的参数的。即便是可以得话,那在申明函数的时候如何标识这个回调函数形参的类型呢?

回调就是在这样一个尴尬的情况下诞生的,来看一下下面的一段代码,如果我们按照\color{red}{javascript}的逻辑去写那么代码应该是这样的:

'''

 //This is a javascript program

using System;

namespace Test

{

class Test

{

         publicTest()

            {

              Calculate(23,45,ShowText);

            }

        public void Calculate(intnum1,intnum2,callback)                    

          {

            int sum=num1+num2;

            callback(sum.ToString());

           }

          public void ShowText(string text)

           {

            Console.WriteLine(text);

           }

         }

     }
'''

但是直接把\color{red}{ShowText}这个函数名传递给\color{red}{Calculate}方法显然在\color{red}{C\#}中是会报错的。这时我们就需要用到委托\color{red}{delegate}。于是我们添加添加一个委托,如下:

  //委托delegate的使用

  using System;

  namespace Test

  {

    class Test

    {

        publicTest()

            {

            ShowTextDel showTextDel=ShowText;

            // 委托就像方法的容器,用户存储方法。

            Calculate(23,45,showTextDel);

            }

            publicvoidCalculate(intnum1,intnum2,ShowTextDel callback)

            {

            intsum=num1+num2;

            callback(sum.ToString());

            }

            // 定义一个只有一个`string`类型参数返回值为`void`的方法的委托。

            public delegatevoidShowTextDel(string text);

            publicvoidShowText(string text)

            {

            Console.WriteLine(text);

            }

        }

    }

'''

有了委托就可以在\color{red}{C\#}中传递回调函数了。但委托有如下的一些注意点:

既然委托作为函数或方法的容器,那么在强类型的\color{red}{C\#}中就需要函数或方法和委托具有相同的结构(即委托与函数或方法必须有相同的参数列表和相同的返回值)。

委托既然作为函数或方法的容器,一个委托可以容纳多个函数或方法。在调用这个委托的时候会依次调用这个委托中的各个方法。具体可以参考微软的官方文档:
使用委托(C# 编程指南)

作者:姜方鑫

[链接]:(https://www.jianshu.com/p/674da938f3d0>)

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

  • 第8章:委托、Lambda表达式和事件

    #1. 委托1.1 声明委托1.2 使用委托1.3 简单委托示例1.4 Action和Func委托1....

  • Delegates, events, lambda expres

    Delegates 委托 委托是一个对象,它知道如何调用一个方法 委托类型和委托实例 委托类型定义了委托实例可以调...

  • 哪些事项是不能办理委托公证的?

    很多种委托事项都可以办理公证,比如委托领取公积金、委托诉讼、委托招投标、委托处理工商理赔、房产委托...等,所...

  • 哪些委托是不能公证的?

    很多种委托事项都可以办理公证,比如委托领取公积金、委托诉讼、委托招投标、委托处理工商理赔、房产委托...等,所...

  • JEX合约交易--委托保证金

    用户进行交易委托将可能会需要冻结委托保证金,其具有如下几项规则: 买入委托所需的委托保证金 = 委托价格 * 委托...

  • Kotlin-委托,是否被低估了?

    1、属性委托 kotlin中的委托主要分为类的委托和属性的委托,我们先重点来看属性委托,用的比较多。 标准委托 k...

  • 隐藏之冰山委托

    冰山委托(Iceberg Order)。冰山委托是隐藏部分委托数量(不在系统中公开显示)的委托,也称为隐藏委托(h...

  • 17_DoTween

    委托,Lambda, LinQ串讲 什么是委托 委托类型是怎么声明出来的 泛型委托 我们必须自己创建委托类型吗? ...

  • Kotlin中的委托

    Kotlin中的委托 啥是委托 其实kotlin中的委托的理念就是委托模式也是叫做代理模式;在Kotlin中委托有...

  • Kotlin学习之类与对象3

    委托 由委托实现 委托模式(https://zh.wikipedia.org/wiki/委托模式)已经证明是实现继...

网友评论

      本文标题:委托

      本文链接:https://www.haomeiwen.com/subject/qjqkmktx.html