zoukankan      html  css  js  c++  java
  • 第十篇 .NET高级技术之委托

    委托是一种可以指向方法的数据类型,可以声明委托类型变量。

    声明委托的方式:delegate返回值类型   委托类型名(参数)

    比如delegate void MyDel(int n)

    注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是Mydel不是函数名,而是委托类型名

    如何创建委托类型的对象:MyDel sp = new Mydel (SayHello)//SayHello需要和MyDel的参数返回值一样;sp这个委托变量就指向SayHello这个方法。注意不要写成new Mydel (SayHello())因为加上()就是调用方法了

    简化的方法:MyDel sp = SayHello;//编译器会给搞成new Mydel (SayHello),反编译看看。注意不要写成MyDel sp = SayHello();

    委托的使用:委托变量之间可以互相赋值,就是一个传递指向方法的过程;sp()就是调用指向的方法,如果有参数就传递参数。

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    namespace mydelSour

    {

        public class Program

        {

            static void Main(string[] args)

            {

                /*

                 * 

                 * 委托如何调用方法

                 * 被调用的方法 返回类型 参数类型 必须要和委托保持一致才可以 如: getNameInt string 参数(string a ,int i)   /delegate string  mydelInt(string na,int a);

                 * 把调用的方法名当参数传入         mydelInt d2 = new mydelInt(getNameInt)     delegate string  mydelInt(string na,int a);  getNameInt(string a ,int i)

                 * 然后用用实例化对象参入参数        d2("henry",3);   参数 (string na,int a);

                    

                */

                mydel dl = new mydel(getName);

                dl();

                mydelInt d2 = new mydelInt(getNameInt);

                //Console.Write(d2); //对象不写括号的话相当于对象tostring   d2.tostring();

                // Console.Write(d2("henry", 3)  ); //带上括号()就指调用方法,带括号和不带括号是不一样的

                d2("henry", 3);

                object[] objs = { 1, 2, 4, 4, 2, 1, 2, 3 };

                //通过这样写,获取最大值的算法已经确定,在传参数的是后指定上比较方法就好了

                //用委托后,我们不在为每个获取最大值的方法都去写一种算法

                int max = (int)GetMax(objs, CompareInt);//原生的写法为GetMax(objs,new CompareNum(CompareInt));//只不过编译器帮我们进行了处理

                Console.WriteLine(max);

                Console.ReadKey();

            }

            public static void getName()

            {

                Console.WriteLine("委托调用无返回类型方法getname");

            }

            public static string getNameInt(string a, int i)

            {

                Console.Write(a + i);

                return a;

            }

            delegate bool CompareNum(object obj1, object obj2);

            static bool CompareInt(object obj1, object obj2)

            {

                int i1 = (int)obj1;

                int i2 = (int)obj2;

                return i1 > i2;

            }

            static object GetMax(object[] obj, CompareNum cpn)

            {

                object max = obj[0];

                for (int i = 1; i < obj.Length; i++)

                {

                    if (!cpn(max, obj[i]))

                    {

                        max = obj[i];

                    }

                }

                return max;

            }

        }

    }

    更多技术请关注

  • 相关阅读:
    python 利用正则表达的式提取特定数据如手机号
    python 横向比较最大值 贴标签
    Go语言基础之17--Redis基本操作
    Mysql5.7.20源码编译安装
    Go语言基础之16--Mysql基本操作
    Go语言学习包(1)之bufio包
    Go语言基础之15--文件基本操作
    Go语言基础练习题系列5
    Go语言基础之14--Waitgroup和原子操作
    Go语言基础之13--线程安全及互斥锁和读写锁
  • 原文地址:https://www.cnblogs.com/dullbaby/p/10910745.html
Copyright © 2011-2022 走看看