在. 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. Linux安装jdk,编写helloworld程序

    今天学习了Linux安装jdk,做个笔记记录一下. 第一步,确定Linux是32位的还是64位的,然后到oracle官网上下载对应版本的jdk,一般下载.tar.gz文件.查看Linux的版本的命令是 ...

  2. 不要在对抽象类接口abstract virtual什么的混淆不清了

    (最近带一个新手入门 讲这边老费力了.) 接口和抽象类不过都是类的抽象罢了,这是他们的本质,只不过人们的思维角度不同而已,一个偏向为行为契约上的抽象(接口) 一个更像大自然中的繁衍关系(抽象类). 直 ...

  3. 对MVC模式与MVVM模式的认识

    MVC模式与MVVM模式目的一样,主要是分离模型(model)和视图(view),具体介绍如下. 名词介绍 MVC模式:指的是模型(Model)-- 视图(View)-- 控制器(Controller ...

  4. web 后端规范与思想

    一.分层1.Web层(接受和发送Http请求的,封装;web层.controller层) 2.业务逻辑层(服务层,XXXService) LoginController(接受参数,判断是否非法,传给服 ...

  5. 判断css文件是否加载完成

    function cssReady(fn, link) { var d = document, t = d.createStyleSheet, r = t ? 'rules' : 'cssRules' ...

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

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

  7. svn 同步资源库时忽略某些文件类型和文件夹

    项目开发中,开发人员经常用SVN来管理代码,在和服务器同步时,每次都看到一堆.class,.log,target等文件,这样很不舒服. 解决方法: 打开:window-->preferences ...

  8. mysql 运行 sql 脚本

    方式一: 打开脚本,复制里面的全部内容,登陆数据库后运行. 方式二: window cmd 运行如下命令: mysql -u root -proot --port 3306 <D:\simple ...

  9. 【Python】Java程序员学习Python(三)— 基础入门

    一闪一闪亮晶晶,满天都是小星星,挂在天上放光明,好像许多小眼睛.不要问我为什么喜欢这首歌,我不会告诉你是因为有人用口琴吹给我听. 一.Python学习文档与资料 一般来说文档的资料总是最权威,最全面的 ...

  10. 团队项目个人进展——Day02

    一.昨天工作总结 冲刺第二天,昨天成功接入高德地图接口,并通过官方提供的文档实现了地图定位功能,通过官方在GitHub上提供的Demo可以看出还能实现天气查看,路径规划等功能: 二.遇到的问题 虽然通 ...