在. 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. pycharm配置环境

  2. Code Signal_练习题_Minesweeper

    In the popular Minesweeper game you have a board with some mines and those cells that don't contain ...

  3. python中类的约束和限制对象添加属性

    通过__slots__限制对象可添加的属性 class A: __slots__ = ['a', 'b'] pass a1 = A() a1.a = 10 print(a1.a) a1.c = 0 # ...

  4. ASP.NET MVC 简单分页代码

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  5. PHP 数值处理的几种常用的方法

    一.直接取整,舍弃小数,保留整数:intval(): intval(9.21); /*结果是9*/ intval(9.89); /*结果是9*/ intval(string); /*如果里面是字符串, ...

  6. String path = request.getContextPath

    <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+ ...

  7. 可执行文件patch技术&&持续更新

    前言 在ctf比赛中, 有时我们需要对可执行文件进行patch, 或者在植入后门时,patch也是常用的手段.不过手工patch比较麻烦,下面介绍几个工具.本文介绍遇到的各种技术,不断更新. ELF ...

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

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

  9. join() 方法详解及应用场景

    总结:join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用jo ...

  10. Ubuntu添加源列表

    1.首先备份源列表:sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup 2.清空原来的/etc/apt/sources.list,添加 ...