委托

作者: 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>)

    来源:简书

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

    相关文章

      网友评论

          本文标题:委托

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