• 委托


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

      

  • 相关阅读:
    nvm切换node失效
    React.memo is not a function
    Path must be a string. Received true
    如何通过node读取excel文件内的数据
    js中四舍五入的方法
    为什么不推荐使用数组的includes方法---记两次includes引起的问题
    改变input复选框样式
    如何使用伪元素扩大按钮可点击区域
    简单实用的纯css按钮效果
    ie6 ie7 ie8 ie9和FireFox Chrome中css区别总结
  • 原文地址:https://www.cnblogs.com/xumaodun/p/4215845.html
Copyright © 2020-2023  润新知