在. net3. 5里面 , 委托的定义和实现被大大的简化了!使用关键字Func或Action就可以定义一个委托 , 使用拉姆达表达式就可以实现一个具体的委托.

Func关键字是用来定义一个有返回值的委托 , 它一共有五个重载 , 我们介绍其中的三个

1 public delegate TResult Func<TResult>();

这表示一个没有参数 , 只有一个返回值的委托 , 返回值的类型就是TResult(泛型)

代码
public class test
{
/// <summary>
/// 定义一个委托
/// </summary>
public Func<string> _GetName;
/// <summary>
/// 一个普通的没有参数 , 有返回值的方法
/// </summary>
/// <returns></returns>
public string GetName()
{
return "张三";
}
public void Main()
{
//3. 5以前的委托的实现 , 直接赋值
_GetName = GetName; //拉姆达表达式的实现方法
_GetName = (
() //因为这个委托没参数 , 所以参数列表没有东西
= > //拉姆达表达式的符号
{ //大括号的代码段表示具体的委托的实现
return "还是张三";
});
//拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return 则可以省略代码段最外面的大括号 , 和return关键字
_GetName = () = > "总是张三";
//调用
string MyName = _GetName();
}
}

2 public delegate TResult Func<T ,  TResult>(T arg);

这表示有且仅有一个参数 , 并且有返回值的委托.

代码
public class test
{
/// <summary>
/// 定义一个委托 , 有一个参数和一个返回值
/// </summary>
public Func<string , string> _GetName;
/// <summary>
/// 有一个参数的方法
/// </summary>
/// <param name = "strName">这是一个参数!</param>
/// <returns>这是一个返回值</returns>
public string GetName(string strName)
{
return strName;
}
public void Main()
{
//3. 5以前的委托的实现 , 直接赋值
_GetName = GetName; //拉姆达表达式的实现方法
_GetName = (
(S) //有一个参数!所以参数列表里面有一个东西 , 这个东西随大家高兴叫个阿猫阿狗都行!只要符合规范
= > //拉姆达表达式的符号
{ //大括号的代码段表示具体的委托的实现
return "还是" + S;
});
//拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return 则可以省略代码段最外面的大括号 , 和return关键字
_GetName = (abc) = > "总是" + abc;
//调用
string MyName = _GetName("张三");
}
}

3 public delegate TResult Func<T1 ,  T2 ,  TResult>(T1 arg1 ,  T2 arg2);

这表示有且仅有两个参数 , 并且有返回值的委托.

代码
public class test
{
/// <summary>
/// 定义一个委托 , 有一个参数和一个返回值
/// </summary>
public Func<string , int , string> _GetName;
/// <summary>
/// 这是一个有两个参数的方法 , 方法的参数类型的顺序必须和委托的参数类型顺序一致
/// </summary>
/// <param name = "strName">第一个是字符类型</param>
/// <param name = "intAGE">第二个是整形 , 请不要颠倒类型!</param>
/// <returns>返回一个字符串 , 对应委托的最后一个参数</returns>
public string GetName(string strName , int intAGE)
{
return string. Format("{0}的年龄是{1}岁" , strName , intAGE);
}
public void Main()
{
//3. 5以前的委托的实现 , 直接赋值
_GetName = GetName; //拉姆达表达式的实现方法
_GetName = (
(S , W) //有一个参数!所以参数列表里面有一个东西 , 这个东西随大家高兴叫个阿猫阿狗都行!只要符合规范
= > //拉姆达表达式的符号
{ //大括号的代码段表示具体的委托的实现
return string. Format("{0}的年龄是{1}岁" , S , W);
});
//拉姆达表达式的简写 , 如果委托的实现代码段中只有一句return 则可以省略代码段最外面的大括号 , 和return关键字
_GetName = (abc , efd) = > string. Format("{0}的年龄是{1}岁" , abc , efd);
//调用
string MyName = _GetName("张三" , );
}
}

Action关键字用来定义一个没有返回值的方法 , 它有一个非泛型方法 , 和四个泛型方法 , 一共五种. Action和func的区别就在于一个没有返回值 , 一个有返回值!其他的都一样!就好像VB的sub和function一样!

1 public delegate void Action();没有参数也没有返回值

代码
public class test
{
/// <summary>
/// 定义一个委托 , 没有返回值也没有参数
/// </summary>
public Action _GetName; public void GetName()
{
System. Windows. Forms. MessageBox. Show("没有参数也没有返回值 , 我只要自己显示了!");
}
public void Main()
{
//3. 5以前的委托的实现 , 直接赋值
_GetName = GetName; //拉姆达表达式的实现方法
_GetName = (
()
= > //拉姆达表达式的符号
{ //大括号的代码段表示具体的委托的实现
System. Windows. Forms. MessageBox. Show("没有参数也没有返回值 , 我只要自己显示了!");
});
//因为action没有返回值 , 所以下面的简写方式是错误的
//_GetName = () = > System. Windows. Forms. MessageBox. Show("没有参数也没有返回值 , 我只要自己显示了!");
//调用
_GetName();
}
}

2  public delegate void Action<T>(T obj);

代码
public class test
{
/// <summary>
/// 定义一个委托 , 没有返回值也没有参数
/// </summary>
public Action<bool> _GetName; public void GetName(bool blnShow)
{
if (blnShow)
{
System. Windows. Forms. MessageBox. Show("要我显示就显示 , 多没面子");
}
else
{
System. Windows. Forms. MessageBox. Show("不要我显示 , 我偏要显示");
}
}
public void Main()
{
//3. 5以前的委托的实现 , 直接赋值
_GetName = GetName; //拉姆达表达式的实现方法
_GetName = (
(b)
= > //拉姆达表达式的符号
{ //大括号的代码段表示具体的委托的实现
if (b)
{
System. Windows. Forms. MessageBox. Show("要我显示就显示 , 多没面子");
}
else
{
System. Windows. Forms. MessageBox. Show("不要我显示 , 我偏要显示");
}
}); _GetName(true);
}
}

有一个参数但没有返回值

Lambda表达式学习(2)的更多相关文章

  1. C# Lambda 表达式学习之(三):动态构建类似于 c => c.Age == null || c.Age > 18 的表达式

    可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...

  2. C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式

    可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...

  3. java lambda表达式学习笔记

    lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...

  4. java 8 中lambda表达式学习

    转自 http://blog.csdn.net/renfufei/article/details/24600507 http://www.jdon.com/idea/java/10-example-o ...

  5. C# Lambda表达式学习笔记

    本笔记摘抄自:https://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html,记录一下学习过程以备后续查用.     一.Lambda ...

  6. Lambda 表达式 学习

    最近几天在学习Lambda,给我的理解就是一个匿名函数的升级版,代码极大可能的简洁了很多,不需要像以前一样必须使用众多的代码才能实现相关功能. 慢慢积累学习,将Java 8的相关知识进行一个学习. 用 ...

  7. Python中lambda表达式学习

    lambda只是一个表达式,函数体比def简单很多. lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去. lambda表达式是起到一个函数速写的作用.允 ...

  8. C#Lambda表达式学习日记

    Lambda表达式只是用更简单的方式来写匿名方法,彻底简化了对.NET委托类型的使用. 现在,如果我们要使用泛型 List<> 的 FindAll() 方法,当你从一个集合去提取子集时,可 ...

  9. C++11 lambda表达式学习

    lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的lambda表达式自己的认识.这里有参考文档h ...

  10. python第l六天,lambda表达式学习,涉及filter及Map。

    在python中lambda表达式可以作为匿名函数来使用,举一个简单的栗子: 以前我们写两个数相加的函数需要 #以前我们写两个数相加的函数,需要这样写 >>> def sum(x,y ...

随机推荐

  1. mysql行转列,列转行

    行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...

  2. 动态We API(ABP官方文档翻译)

    动态Web API层 创建动态Web API控制器 ForAll方法 重写ForAll ForMethods Http动词 WithVerb方法 HTTP特性 命名约定 API管理器 RemoteSe ...

  3. javascript代码

    LazyMan 实现LazyMan(什么是LazyMan?请自行google) function _LazyMan(_name) { var _this = this; _this.tasks = [ ...

  4. Kriging插值计算

      参考论文:      http://people.ku.edu/~gbohling/cpe940 # -*- coding: utf-8 -*- # ----------------------- ...

  5. 使用MaxCompute访问TableStore(OTS) 简明手册

    摘要: 大数据计算服务 MaxCompute 能够提供强大的分析能力,而分布式 NoSQL 数据库表格存储在行级别上的实时更新和可覆盖性写入等特性,相对于 MaxCompute 内置表 append- ...

  6. linux 目录操作命令 mkdir、rmdir、cd -、cp、scp、mv、rm

    mkdir /bin/mkdir-p [目录名] 递归创建 mkdir /tmp/testmkdir /tmp/noexit/test在一个不存在的目录下创建一个目录test,要使用-p选项 可以创建 ...

  7. requestURI的组成部分

    使用 java EE HttpServletRequest对象获取的 request.getRequestURL(); request.getRequestURI(); request.getCont ...

  8. oracle lz047中的REGEXP_LIKE(cust_first_name,'[[:digit:]]')) .

    转自http://blog.csdn.net/dream19881003/article/details/6680982 今天在看OCP题库的时候有一道题是考字段约束的,意思是要在表CUSTOMERS ...

  9. 在Mac上用bootcamp安装windows,使用Android studio启动模拟器时蓝屏问题的解决方法

    原链接 https://medium.com/@andrea.bresolin/windows-10-on-mac-with-boot-camp-making-intel-haxm-work-with ...

  10. Oracle 处理坏块

    本文主要介绍如何去处理在Oracle数据库中出现坏块的问题,对于坏块产生在不同的对象上,处理的方法会有所不同,本文将大致对这些方法做一些介绍.因为数据库运行时间长了,由于硬件设备的老化,出现坏块的几率 ...