Csharp/C#教程:基于C#委托的深入分析分享

1.委托的定义

委托可以看成是一种数据类型,可以用于定义变量能接受的值只能是一个方法。

委托简单的示例:
代码如下:
namespaceDelegateDemo
 {
    classProgram
    {
        publicdelegateintMathOptDelegate(intvalue1,intvalue2);
        publicintadd(intvalue1,intvalue2)
        {
            returnvalue1+value2;
        }
        staticvoidMain(string[]args)
        {
            MathOptDelegatemod;
            Programp=newProgram();
            mod=p.add;
            Console.WriteLine(mod(3,5));
            Console.ReadKey();
        }
    }
 }

利用委托的构造函数创建委托
代码如下:
namespaceDelegateDemo
 {
    classProgram
    {
        publicdelegateintMathOptDelegate(intvalue1,intvalue2);
        publicintadd(intvalue1,intvalue2)
        {
            returnvalue1+value2;
        }
        staticvoidMain(string[]args)
        {
            Programp=newProgram();
            MathOptDelegatemod=newMathOptDelegate(p.add);
            Console.WriteLine(mod(3,5));
            Console.ReadKey();
        }
    }
 }

从这个示例中可以得出这样的直观印象:

委托可以堪称是一个方法的容器,将某一个具体的方法装入后,就可以把它当成方法一样使用。

2.委托的调用列表

从上一个例子看,委托变量可以引用某一个方法,调用它就相当于调用这个方法。

如果委托今年仅是方法调用的另一种形式,那何必多此一举引入委托这一特性?直接调用方法不是更简单明了?

因为委托变量不仅可以引用另一个方法,还可以组合多的方法并批量执行它们。
代码如下:
namespaceDelegateDemo2
{
   classProgram
   {
       publicdelegatevoidMyDelegate(Stringstr);
       publicstaticvoidhello(Stringstr)
       {
           Console.WriteLine(str+”你好”);
       }
       publicstaticvoidgoodbye(Stringstr)
       {
           Console.WriteLine(str+”再见”);
       }
       staticvoidMain(string[]args)
       {
           MyDelegatea,b,c,d;
           a=Program.hello;
           a(“a”);
           b=Program.goodbye;
           b(“b”);
           c=a+b;//等价将两个方法体合并
           c(“c”);//c你好c再见
           d=c-a;
           d(“d”);//d再见
           Console.ReadKey();
           
       }
   }
}

像C这样的委托变量可称为多路委托变量。

可以用加法运算符来组合单个委托变量为多路委托变量。类似的,也可以使用减法运算符来从一个多路委托变量中移除某个委托变量。
代码如下:
namespaceDelegateDemo2
{
   classProgram
   {
       publicdelegatevoidMyDelegate(Stringstr);
       publicstaticvoidhello(Stringstr)
       {
           Console.WriteLine(str+”你好”);
       }
       publicstaticvoidgoodbye(Stringstr)
       {
           Console.WriteLine(str+”再见”);
       }
       staticvoidMain(string[]args)
       {
           MyDelegatea,b,c,d;
           a=Program.hello;
           a(“a”);
           b=Program.goodbye;
           b(“b”);
           c=a+b;//等价将两个方法体合并
           c(“c”);//c你好c再见
           d=c-a;
           d(“d”);//d再见
           Delegate[]ds;
           ds=c.GetInvocationList();
           foreach(Delegatesinds)
           {
               Console.WriteLine(s);
               //DelegateDemo2.Program+MyDelegate
               //DelegateDemo2.Program+MyDelegate
           }
           Console.WriteLine(ds.Length);
           Console.ReadKey();
           
       }
   }
}

如果委托定义的方法有返回值,则多路委托变量的返回值为委托调用列表中最后一个方法的返回值,中间调用的方法返回值会被丢弃。

使用泛型委托:

 Func系列委托

以下是Func熄了委托的定义,依其泛型类型参数的多少有多个重载形式:

publicdelegateTResultFunc<Tresult>();

publicdelegateTResultFunc<T,Tresult>();

 

上述就是C#学习教程:基于C#委托的深入分析分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com) 您可能感兴趣的文章:C#中委托和事件在观察者模式中的应用实例C#委托delegate实例解析c#委托详解和和示例分享c#委托学习示例分享c#委托把方法当成参数(实例讲解)c#并行任务多种优化方案分享(异步委托)C#委托的三种调用示例(同步调用异步调用异步回调)C#中委托的基本用法

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ctvol.com/cdevelopment/904606.html

(0)
上一篇 2021年10月22日
下一篇 2021年10月22日

精彩推荐