zoukankan      html  css  js  c++  java
  • 委托

      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));
        }
      }

      

  • 相关阅读:
    【Leetcode】【hard】Binary Tree Postorder Traversal
    【Leetcode】【Easy】Contains Duplicate
    【Leetcode】【Easy】Isomorphic Strings
    【Leetcode】【Medium】Simplify Path
    【Leetcode】【Medium】Add Two Numbers
    【Leetcode】【Hard】Copy List with Random Pointer
    安装torch-opencv
    【转】ubuntu下修改文件夹权限
    Lua 中的 function、closure、upvalue
    多目标跟踪方法 NOMT 学习与总结
  • 原文地址:https://www.cnblogs.com/xumaodun/p/4215845.html
Copyright © 2011-2022 走看看