委托

  1.委托的声明

  委托是引用类型,因此有引用和对象,使用方法和类相似。

  可以把委托看做一个包含有序列表的对象,但是这些方法必须具有相同的签名和返回类型。

  delegate void MyDel (int x)  //delegate 关键字 viod 表示返回类型 int x 表示参数类型

  委托看起来和方法很类似,需注意是没有方法主体。

  2.创建委托对象

  delegate void MyDel (int x)

  MyDel delVar ;  //创建委托变量

  delVal = new MyDel (Class.Method) ;   //创建委托,并保存引用

  delVal = Class.Method ;   //创建委托,并保存引用 ,语法和上面相同

  3.给委托赋值

  MyDel delVar ; 

  delVar = Class.method1 ;

  delVar  = Class.method2 ;   //创建新的委托并对对象赋值,上面的method1将会被垃圾站回收

  4.组合委托

  委托可以使用“+”运算符来组合,最终会创建一个新委托。 

  MyDel delVar1 = Class.method1 ;

  MyDel delVar2  = Class.method2 ;

  MyDel deVar3 = delVar1 + delVar2 ;

  5.为委托添加方法和移除方法

  使用“+=”可以为委托增加方法。

  MyDel delVar = Class.method1 ;

  delVar += Class.method2 ;

      delVar += Class.method3 ;

   delVar -=  Class.method1 ;

   如果调用列表(书244)有很多实例,-=运算符将从列表最后开始搜索,并且移除与第一个方法相匹配的实例。

  6.委托示例代码如下:  

  delegate void MyDel() ;
  class Test
  {
    public void Print1()
    {Console.WriteLine("Print1 -- instance");}
    public static void Print2()
    { Console.WriteLine("Print2 -- static"); }
  }
  class Program
  {  
    static void Main(string[] args)
    {
      Test t = new Test();
      MyDel del = t.Print1;
      del += Test.Print2;
      del += t.Print1;
      del += Test.Print2;

      if (null != del)
        del();
      else
        Console.WriteLine("Delegate is Empty!");
    }
  }

  7.调用带引用参数的委托 

  注意:不加ref答案是7 ,加ref答案是12

  delegate int MyDel( ref int value) ;
  class MyClass
  {
    public int Add2( ref int value) { value += 2; return value; }
    public int Add3( ref int value) { value += 3; return value; }
  }
  class Program
  {
    static void Main(string[] args)
    {
      MyClass mc = new MyClass();
      MyDel Del = mc.Add2;
      Del += mc.Add3;
      Del += mc.Add2;
      int value = 5;
      Console.WriteLine("{0}" ,Del( ref value));
    }
  }

  

原文地址:https://www.cnblogs.com/xumaodun/p/4215845.html