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

      

  • 相关阅读:
    关于Mac网络偏好设置的一些坑
    NOI2018网络同步赛爆零记
    【搞事情】英文文档单词对比&自动翻译
    函数
    文件处理的详细介绍
    字符编码+文件处理
    元组类型+字典类型+集合类型的详细讲解
    可变不可变类型+数字类型、字符串类型、列表类型的内置方法
    流程控制之if判断,while循环,for循环
    变量剩余补充+基本数据类型+输入输出+基本运算符
  • 原文地址:https://www.cnblogs.com/xumaodun/p/4215845.html
Copyright © 2011-2022 走看看