zoukankan      html  css  js  c++  java
  • 委托

      可以认为委托是一个持有多个方法的对象,当然正常情况下你不会"执行"一个对象,但是委托和典型的类型不同。可以执行委托,这时候委托变量执行它所持有的"方法"。

    /// <summary>
    /// 声明委托类型
    /// </summary>
    /// <param name="value"></param>
    delegate void MyDel(int value);
    static void Main(string[] args)
    {
        // 声明委托变量
        MyDel myDel;
        Program program = new Program();
        Random random = new Random();
        int randomValue = random.Next(99);
        if (randomValue > 50)
        {
            // 给委托变量赋值
            myDel = new MyDel(program.PrintLow);
        }
        else
        {
            myDel = new MyDel(program.PrintHigh);
        }
        // 调用委托变量中的方法
        myDel(randomValue);
        Console.ReadKey();
    }
    
    // 委托最大的好处就是可以将方法当作参数传入,这样做的好处就是?
    void PrintLow(int value)
    {
        Console.WriteLine($"{value}长度");
    }
    
    void PrintHigh(int value)
    {
        Console.WriteLine($"{value} 宽度");
    }

    使用委托:

    1.声明委托类型
    2.声明委托类型变量
    3.创建委托类型的对象,把值赋值给委托变量。新委托对象包括某个方法的引用
    4.为委托对象增加其他方法,方法必须满足委托相同的签名和返回类型 ,,
    5.在代码中调用委托
    可以把委托变量当作一个包含多个方法列表的变量

    组合委托:

    /// <summary>
    /// 声明委托类型
    /// </summary>
    /// <param name="value"></param>
    delegate void MyDel(int value);
    static void Main(string[] args)
    {
        // 声明委托变量
        MyDel myDel1, myDel2, myDel3;
    
        Program program = new Program();
        Random random = new Random();
        int randomValue = random.Next(99);
        myDel1 = program.PrintLow;
    
        myDel2 = program.PrintHigh;
        myDel3 = myDel1 + myDel2;
        // 调用委托变量中的方法
        myDel3(randomValue);
        Console.ReadKey();
    }
    
    void PrintLow(int value)
    {
        Console.WriteLine($"{value}长度");
    }
    
    void PrintHigh(int value)
    {
        Console.WriteLine($"{value} 宽度");
    }

    打印:

    54长度
    54 宽度

    名字看上去是想委托被改变了一样但是委托是恒定的没有被改变

    为委托添加方法使用+=

    为委托删除方法使用-=

    使用+=和-=符号是重新创建了一个委托变量把值赋值给委托变量

    示例:

            /// <summary>
            /// 声明委托类型
            /// </summary>
            /// <param name="value"></param>
            delegate void PrintFunction();
            static void Main(string[] args)
            {
        Test t = new Test();
        PrintFunction pf;
        pf = t.Print1;
        pf += Test.Print2;
        pf += t.Print1;
        pf += Test.Print2;
        if (pf != null)
        {
            pf();
        }
        else
        {
            Console.WriteLine("委托变量是空的");
        }
        Console.ReadKey();
    }
    
    class Test
    {
        public void Print1()
        {
            Console.WriteLine("我是方法Print1");
        }
        public static void Print2()
        {
            Console.WriteLine("我是方法Print2");
        }
    }

    打印结果:

    我是方法Print1
    我是方法Print2
    我是方法Print1
    我是方法Print2

     顺序执行方法

    如果委托是带有返回值的,那么它将接受最后一个方法的返回值

    /// <summary>
    /// 声明委托类型
    /// </summary>
    /// <param name="value"></param>
    delegate int  AddFunction();
    static void Main(string[] args)
    {
        AddFunction addFunction ;
        Test t = new Test();
        addFunction = t.Add1;
        addFunction += t.Add2;
        int result =  addFunction();
        Console.WriteLine(result);//3
        Console.ReadKey();
    }
    
    class Test
    {
        int value = 1;
        public int Add1()
        {
            return value + 1;
        }
        public   int Add2()
        {
            return value + 2;
        }
    }

    调用带引用(ref)参数的委托,在读题部分委托列表的下一个方法时,参数值不是初始值而是传递给下一个参数。

    知识点:

    委托类型是引用类型,所以委托类型的变量和类变量一样保存对象的一个引用。
    在创建委托类型的时候方法就有些想一个对象一样。
    委托变量保存这个方法对象的引用并可以去使用他; 给委托变量重新赋值
    就相当于更改了委托变量的引用

  • 相关阅读:
    Java中的24种设计模式与7大原则
    Red Hat Enterprise Linux 6安装步骤
    jquery之获取当前时间和月份加1
    新手看过来:随车千斤顶怎么用?
    空挡滑行和带挡滑行究竟谁省油 误区要知道
    怎么开手动档轿车?这么开让你再也不想开自动档
    FindBugs插件的安装与使用
    图解Eclipse中安装和使用FindBugs
    新手开车上高速 不懂这些安全细节非常危险
    酒桌游戏
  • 原文地址:https://www.cnblogs.com/-alvin/p/11601922.html
Copyright © 2011-2022 走看看