C#沉淀之委托的深入讲解

2020-01-05 09:37:19刘景俊

示例:MyDel类型参考上面的定义


MyDel del = object.FuncA; //创建并初始化委托对象
del += object.FuncB; //增加方法
del += object.FuncC; //增加方法

//调用委托 
del(55);

参数55会在调用委托对象时依次传递给保存的方法

一个完整的委托示例代码


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeForDelegate
{
 class Program
 {
  //定义委托类型
  delegate void PrintFunction(string txt);

  //测试类中定义三个方法
  class Test
  {
   public void PrintA(string txt)
   {
    Console.WriteLine("printA:{0}", txt);
   }

   public void PrintB(string txt)
   {
    Console.WriteLine("printB:{0}", txt);
   }

   public static void PrintC(string txt)
   {
    Console.WriteLine("printC:{0}", txt);
   }
  }
  static void Main(string[] args)
  {
   Test test = new Test();
   PrintFunction pf;

   //实例化并创建委托对象
   pf = test.PrintA;

   //为委托对象增加方法
   pf += test.PrintB;
   pf += Test.PrintC;
   pf += test.PrintA; //添加一个重复的方法

   //通过与null比较,确认委托对象中保存了方法
   if (pf != null)
    pf("Hello");
   else
    Console.WriteLine("pf是个空委托!");

   Console.ReadKey();
  }
 }
}

调用带有返回值的委托

如何委托有返回值,并且调用列表中有一个以上的方法,那么将使用最后一个方法的返回值,之前方法的返回值被忽略

示例:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeForDelegate
{
 class Program
 {
  //定义委托类型
  delegate int DelFunction();

  //测试类中定义三个方法
  class Test
  {
   int IntValue = 0;
   
   public int FuncA()
   {
    return IntValue += 1;
   }

   public int FuncB()
   {
    return IntValue += 10;
   }
  }
  static void Main(string[] args)
  {
   Test test = new Test();
   DelFunction df;

   df = test.FuncA;
   df += test.FuncB;

   //最终返回值的是11
   if (df != null)
    Console.WriteLine("返回值:"+df());
   else
    Console.WriteLine("pf是个空委托!");

   Console.ReadKey();
  }
 }
}