C# - 委托浅入

一、委托 :Delegate

1、委托是一个类,同时也是数据类型,一种引用类型,可用于存储、传递方法。
2、主要的意义在于将变化的方法封装起来。
3、讲白了,就是为了解决一个方法作为参数传到另一个方法中的问题而来的,让方法灵活。

使用:

步骤分为三步:

1、定义委托类型
2、声明委托变量,并赋值
3、调用委托

        //1.定义委托类型
        //定义一个委托类型,用来保存无参数,无返回值的方法
        //定义了一个名字为MyDelegate的类型,并且这个类型是个委托而且只能存储没有返回值,没有参数的方法
        //委托要定义在命名空间 , 和类是同一级别'
        public delegate void MyDelegate();
        //泛型委托
        public delegate void my(T scr);

        static void Main(string[] args)
        {
           //2.使用委托的第二步:声明委托变量,并赋值
            //声明了一个委托变量md,并且new了一个委托对象,并且把方法M1传递进去
            //即md为多保存了M1方法'
            MyDelegate md = new MyDelegate(M1);
           //3.调用md委托的时候就相当于调用了M1方法'
            md();
            Console.WriteLine("OK");
            Console.ReadKey();
            

        }

        static void M1()
        {
            Console.WriteLine("这是一个没有返回值没有参数的方法");
        }
    }

我们会发现,如果我们频繁使用委托,就会大量的去先定义委托类型,会比较的麻烦。所以微软很贴心的加了两个关键词:Action 、 Func 和 Predicate,这两个委托类型区别在于有无返回值。

关于Action:

Action可以接受0到16个参数传入,但是没有返回值 例如:Action

 static void Main(string[] args)
        {
            //Action    可以传入0-16个参数,无返回值
            Action actionDel = new Action(AddInstance_Action);
            actionDel(6 , 8);
        }
        public static void AddInstance_Action(int a , int b)
        {
            Console.WriteLine(a + b);    
        }
关于Func:

Func可以接受1到16个参数传入,必须有返回值,参数最后一个为返回值,在只有一个参数时,为返回值。 例如:Func

 static void Main(string[] args)
        {
            //Func       可以传入0-16个参数,必须有返回值,最后一个为返回值,必须有
            Func funcDel = new Func(AddInstance_Func);
            Console.WriteLine(funcDel(6));
        }
        public static int AddInstance_Func(int a)
        {
            return a + 3;
        }
关于Predicate:

Predicate是返回bool型的泛型委托,Predicate有且只有一个参数,返回值固定为bool。表示定义一组条件并确定指定对象是否符合这些条件的方法。此方法常在集合(Array 和 List)的查找中被用到,如:数组,正则拼配的结果集中被用到。
我们以数组中的FindAll方法为例

int[] arr = new int[] 
 {
         4,6,90,6,8,3,1
 };
int [] resultArr = Array.FindAll(arr , CompareInt);//参数CompareInt即是一个Predicate,在具体的执行中,每一个数组的元素都会执行指定的方法,如果满足要求返回true,并会被存放在结果集中,不符合的则被剔除,最终返回的集合,即是结果判断后想要的集合。
foreach (var item in resultArr)
{
        Console.WriteLine(item.ToString());
}
private static bool CompareInt(int a)
        {
            if (a >= 4)
            {
                return true;
            }
            return false;
        }

二、lambda表达式

lambda表达式是一种匿名函数,是高效的编程表达式,它是匿名函数的升级,使得更简化。其与委托使用,更体现出委托对的便利与代码简化。

//定义委托类型
public delegate void MyDelegate();
public delegate void MyDelegate1(string m);
public delegate void MyDelegate2(string m , int n , int k);
public delegate string MyDelegate3(string m);
//声明委托,并赋值:
//第一种lambda表达式,没有参数没有返回值;
MyDelegate md = () =>{ 
    Console.WriteLine("lambda表达式,无参无反");
};
//第二种,有参数,没有返回值,
//传的值无需标明类型,因为声明委托时已注明,系统自动识别'
MyDelegate1 md = m =>{ 
    Console.WriteLine("lambda表达式,有参无返");
    Console.WriteLine(m);
};
//或者多个参数
MyDelegate2 md = (m , n , k)=>{ 
    Console.WriteLine("lambda表达式,有参无返");
    Console.WriteLine(m , n , k);
};
//第三种,有参数,有返回值,
MyDelegate3 md = (m)=>{ 
    Console.WriteLine("lambda表达式,有参有返");
    Console.WriteLine(m );
    return m;
};

你可能感兴趣的:(C# - 委托浅入)