zoukankan      html  css  js  c++  java
  • C# 委托、匿名方法以及lambda表达式

    一、自定义委托:
    自定义委托需要用到关键字delegate
    定义的委托想要调用方法时,委托的返回值类型与参数必须与方法一致
    例如以下三种使用方式:
    1.无参数无返回值:

    private delegate void GetValue();//定义的委托
    private static void  PrintMsg()  //委托需要调用的方法
    {
        Console.WriteLine("通过委托调用无参数的函数");
    }
    

    这时委托的调用方式是:

    GetValue getValue = PrintMsg; //创建一个委托对象将方法指定给委托
    getValue(); //调用
    

    2.有参数无返回值:

    private delegate void GetValue2(int i);
    private static void  PrintMsg2(int i)
    {
        Console.WriteLine("通过委托调用有参数的函数"+i);
    }
    

    这时委托的调用方式是:

    GetValue2 getValue2 = PrintMsg2;
    getValue2(20);   //这时注意需要给委托传参
    

    3.有返回值及参数:

    private delegate int GetValue3(int i);
    private static int PrintMsg3(int i)
    {
        return i;
    }
    GetValue3 getValue3 = PrintMsg3;
    int data=getValue3(100);   //可以定义变量去接收返回的数据
    

    二、vs中自带的委托

    1.Action委托:
    定义形式:public delegate void Action<in T>(T obj);
    Action委托是没有返回值的不能对有返回值的方法使用
    Action<int> a = GetStr; //其中尖括号里面为方法的参数有几个参数就需要设置几个没有的话可以不写尖括号
    a(20);
    2.Func委托:
    定义:
    public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
    Func委托必须有返回值并且尖括号里面的最后一个为返回的数据其余的为参数.

    使用方法:
    private static int PrintMsg3(int i)
    {
    return i;
    }
    Func<int,int> f =PrintMsg3;
    int data=f(100);

    注意这两个委托至多有16个参数(因为里面只写了16个重载)
    三、匿名方法与lambda表达式:
    匿名方法:
    匿名方法与lambda表达式是基于委托的存在
    匿名方法是不需要写返回值与方法名字的
    如果需要用无返回值的匿名方法可以用Action,用有返回值的可以用Func

    例如:
    用匿名方法写一个无返回值可以输出两个数的和:
    //因为不需要返回值可以用Action定义而需要两个数的和所以需要两个参数
    Action<int, int> a = delegate(int i, int m)
    {
    Console.WriteLine(i + m);
    };
    a(3, 5);
    用匿名方法写一个有返回值可以输出两个数的和:
    Func<int, int, int> f = delegate(int a, int b)
    {
    return a + b;
    };
    Console.WriteLine(f(5,6));

    lambda表达式:
    使用环境:在写一个不经常用到的一个函数时可以考虑使用,因为如果不经常使用那个函数还要再给它单独写一个方法太占代码量了
    lambda表达式其实是匿名方法的另一种表现形式它没有返回值没有参数类型,如果需要参数可以直接写参数名字不需要给类型
    定义方式:
    委托类型 委托的变量名=(参数1,参数2,...)=> //不需要参数时可以不用写参数直接()=>
    {
        //lambda表达式的函数体

    };

    下面来几个栗子:

    //无参数的Action 委托
    Action a1 = () =>
    {
          Console.WriteLine("这是一个没有参数的lambda表达式");
    };
    a1();
    
    //有参数的Action 委托
    Action<int> a2 = (x) =>
    {
    Console.WriteLine("这是有一个参数的lambda表达式,参数类型为"+x.GetType()+"数据是:"+x);
    };
    a2(2);
    //无参数的Func委托(Func因为必须要有返回值所以尖括号里至少有一个类型)
    Func<int> f = () =>
    {
                    //函数体
                    int x = 2;
                    int y = 3;
                    return x * y;
    };
    Console.WriteLine(f());
    
    //有参数和返回值的Func委托
    Func<int,int> f1 = (c) =>
    {
         //函数体
                   
         return c;
    };
    Console.WriteLine(f1(5));
    

      

  • 相关阅读:
    Enterprise Library 企业库 V4.1
    跨域实现IFRAME自适应高度
    微软企业库4.1学习笔记(二)各功能之间的依赖关系以及对象创建
    微软企业库4.1学习笔记(三)企业库迁移和并行使用,以及企业库的扩展
    微软企业库4.1学习笔记(五)对象创建和依赖注入方法
    判断 iframe 是否加载完成的完美方法
    对JavaScript调用堆栈和setTimeout用法的深入研究
    工作流技术杂谈
    企业流程管理平台V2.0介绍(.NET平台下的工作流)
    c#操作oracle lob字段[转自 芽芽的回收站]
  • 原文地址:https://www.cnblogs.com/lichuangblog/p/8042263.html
Copyright © 2011-2022 走看看