C#-委托与lambda表达式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/// <summary>
/// C#中的委托就是一个指向方法的参数,可以把一个委托类型作为参数传递到另外一个方法里面。
/// C#里面内置的委托类型有Action 和 Func
/// Action是无返回值,可为无参数,无返回值,可以利用泛型传递参数的委托,Func是有返回值,也可以利用泛型传递多个参数,最后一个是Out 返回值,如果只有一个参数,则默认无返回值,不可为无参数
/// 委托也可以进行重新赋值(方法),就想参数赋值一样即可
/// </summary>
namespace 委托
{
    class Program
    {
        //委托的声明和类的类试
        private delegate void voidDele();
        private delegate int intDele();
        private delegate int paraDele(int para1,int para2,int para3);

        private static void printString()
        {
            Console.WriteLine("无参数");
        }
        private static int intReturn()
        {
            return 0;
        }
        private static string printFuncString()
        {
            Console.WriteLine("Func一定会有返回值");
            return "一定会有返回值";
        }
        private static int printString(int i)
        {
            Console.WriteLine("无参数类型有返回类型");
            return 0;
        }
        private static void printString(int i0,int i1)
        {
            Console.WriteLine(i0+i1);
        }
        private static int printString(int i0,int i1,int i2)
        {
            return i0 + i1+i2;
        }

        /// <summary>
        /// 匿名函数与委托
        /// 匿名函数没有名字,无法直接调用,多用与赋值给委托,便于后面回调函数,声明是需要有        delegate
        /// lambda是匿名函数的简写形式,一个参数,一个返回值的时候可以省略括号和return
        /// </summary>

        static void Main(string[] args)
        {
            //委托的声明也像类一样需要各自对应委托的类型
            voidDele voidDele0 = printString;
            intDele intDele0 = intReturn; //一定要依据重载关系来判断能否找到相应的函数
            paraDele para0 = printString;

            Action act00 = printString;
            act00();
            Action<int, int> act01 = printString;//重载里面会自动寻找相对应的方法
            act01(10,10);

            Func<string> fun00 = printFuncString;
            fun00();
            Func<int, int> fun01 = printString;
            fun01(10);


            Func<int, int, int> Noname = delegate (int para1, int para2)
            {
                return para1 + para2;
            };
            //lambda
            Func<int, int, int> NewName = (int para1, int para2) =>
              {
                  return para1 + para2;
              };

            Func<int, int> OneName = para2 => para2++;
            Console.ReadKey();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Icecoldless/article/details/81840755
今日推荐