美文网首页
C# - 委托浅入

C# - 委托浅入

作者: Memoyu | 来源:发表于2019-04-14 14:42 被阅读0次

一、委托 :Delegate

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

使用:

步骤分为三步:

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

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

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

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

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

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

    一、委托 :Delegate 1、委托是一个类,同时也是数据类型,一种引用类型,可用于存储、传递方法。2、主要的意...

  • C# 委托

    C#委托 C#中的委托(Delegate)类似于C或C++中函数的指针。委托(Delegate)是存有对某个方法的...

  • 教小明学一点点编程—C#篇(0)

    像小明这样使用C#的新同学,一定都会被C#的复杂的委托事件机制所困惑,那么我们不如解释一下什么是C#中委托。 委托...

  • C#委托 匿名函数 Lambda

    C# 中委托的发展#在 C# 1.0 中,通过使用在代码中其他位置定义的方法显式初始化委托来创建委托的实例。 C#...

  • 2020-02-19

    C# 委托 (一)—— 委托、 泛型委托与Lambda表达式 原创wnvalentin 最后发布于2018-08-...

  • (转).NET面试题系列[7] - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位。 C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括...

  • 委托及其用法

    C#委托使用详解(Delegates) 1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻。说...

  • C# 高级语言总结

    后续 1 C# 委托 委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 ...

  • C#匿名方法、Lambda表达式和各种泛型委托

    Linq查询与高级C#编程机器理论研究基础 C#委托解决的是对象之间的逆向传递问题,其次,委托还有其他的用途(匿名...

  • C#中的委托是用来干嘛的

    在C#中我们会听到一个概念——委托。那么委托是个什么鬼,用来干嘛的呢?最近有些空闲时间就写一下C#中委托相关的知识...

网友评论

      本文标题:C# - 委托浅入

      本文链接:https://www.haomeiwen.com/subject/tylzbftx.html