在. 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. app判断链接参数后缀跳转不同地址

    http://testhf.irongbei.com/DoubleAct/index?from=app <?php $urlp = (isset($_GET['from']) && ...

  2. 关于YII中layout中的布局和view中数据的关系

    1. view中解释php脚本后显示出的内容会在layout中以<?php echo $content?>输出. 2. view是对应的controller的实例,所以可以通过$this- ...

  3. 【代码笔记】iOS-cell折叠

    一,效果图. 二,工程图. 三,代码. AppDelegate.h #import <UIKit/UIKit.h> //加入头文件 #import "myQQView.h&quo ...

  4. 【转发】【小程序】微信小程序日常开发中常遇到的错误代码

    还在为看不懂小程序错误状态码纠结吗?这里推荐一篇文章 重要的事情说三遍:原文链接  https://www.cnblogs.com/webonline/p/7528778.html 作者:玩世不恭. ...

  5. 浅析javascript高阶函数

    什么是高阶函数:在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数: 1. 接受一个或多个函数作为输入: 2. 输出一个函数.在数学中它们也叫做算子(运算符)或泛函.微积分中的导数就是常见的例 ...

  6. maven学习知识点汇总

    1. 2.maven自动建立目录骨架 首先进入目录结构:  PS C:\WINDOWS\system32> cd C:\Users\10563\Desktop\test 然后输入自动构建命令:  ...

  7. 润乾V5手机报表说明文档

    1.手机报表实例页面简要说明 index.jsp 是报表资源列表页面: mbReport.jsp 是报表展现页面: mbParam.jsp是参数报表展现页面: echarts.jsp是带有echart ...

  8. Java线程池相关类-Executor框架

    1.Executor 接口源码: public interface Executor { /** * Executes the given command at some time in the fu ...

  9. create alter rename desc select update delete insert

    conn scott/root;create table student (id number(3), name varchar2(10), sex char(2), sno number(3));a ...

  10. Oracle EBS AR 收款API收款方法标识无效

    1.确认是不是没有收款方法 methods那个表的问题2.查看收款方法那个LOV的问题3.界面录入 是否会有问题  碰到的问题是 收款日期比较早时 找不到对应的收款方法 银行账户需要重新设置