C# 委托、匿名方法以及lambda表达式

摘要:
1、 自定义委托:当自定义委托需要使用关键字委托定义的委托来调用方法时,委托的返回值类型和参数必须与该方法一致。例如,以下三种用法:1.无参数,无返回值:privatedelegatevoidGetValue()//定义的委托privatestaticvoidPrintMsg()//委托需要调用的方法{Console.WriteLine(“通过委托调用没有参数的函数”);}委托的调用方法

一、自定义委托:
自定义委托需要用到关键字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));

  

免责声明:文章转载自《C# 委托、匿名方法以及lambda表达式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇javaScript 基础知识汇总(六)如何优化 Java 性能?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

经典算法_数组

1 对一个一维数组进行按照元素的升序大小进行排序,冒泡排序法 2 随机生成一个有10个元素的一维数组,并找出极值 3 将一个一维数组中n个整数按相反顺序存放 4 用指针方法对10个整数按照从大到小顺序排序,冒泡排序法 5 用随机数生成一个数组,写一个函数查找最小的,并返回最小数的地址。在主函数中打印出来最小数 6 不改变原有的一维数组排序,使用指针数组,进...

Spring Cloud Finchley.SR1 版本的坑:placeholer占位符无法解析!

接入nacos 之后,想把所有的配置丢上去。 启动程序是: @EnableDiscoveryClient @RestController @ComponentScan(basePackages = {"com.lkk"}) @MapperScan(basePackages = {"com.lkk.ppm.doc.service.dao"}) @Im...

PortAudio详解(2015年12月1日更新)

PortAudio详解 整理者:赤子玄心 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 1   简介 PortAudio是一个免费、跨平台、开源的音频I/O库。看到I/O可能就想到了文件,但是PortAudio操作的I/O不是文件,而是音频设备。它能够简化C...

Arcgis python geometry

Geometry 描述 来自:https://pro.arcgis.com/zh-cn/pro-app/arcpy/classes/geometry.htm 几何对象定义空间位置和关联几何形状。 说明 在许多地理处理工作流中,您可能需要使用坐标和几何信息运行特定操作,但不一定想经历创建新(临时)要素类、使用光标填充要素类、使用要素类,然后删除临时要素...

flask-apscheduler重复执行两次函数

flask-apscheduler 使用方法:1.安装flask-apscheduler 2.实例化并绑定app 3.config.py 配置文件设置:id就是这个任务的编号,func 是需要执行的函数。args是函数需要的参数。trigger 有3种:date(一次性任务),cron(定时任务),interval(循环任务)interval循环间隔调度,...

VC:CString用法整理(转载)

1.CString::IsEmpty BOOL IsEmpty( ) const; 返回值:如果CString 对象的长度为0,则返回非零值;否则返回0。 说明:此成员函数用来测试一个CString 对象是否是空的。 示例: 下面的例子说明了如何使用CString::IsEmpty。 // CString::IsEmpty 示例 CStrin...