linq-匿名方法,匿名委托,lambda演化

一:匿名方法,委托,匿名委托,lambda。。。

1. 委托=> 函数指针

2. 委托不是一个新概念,在其他的编程语言中早已经产生。

javascript:非常熟悉匿名函数【闭包】

C++: 函数指针

3. 那么C#为了引进这个函数指针,将其进行包装成“委托”,同时将非托管的变成托管的。

4. 委托的定义

/// <summary>
/// 这就是一个委托的定义
/// </summary>
/// <param name="str"></param>
delegate void MyAction(string str);

5. 委托的演化过程

函数指针 -> 委托【高等封装】

1. 最初的委托该怎么用???

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyAction action = Run;

action("mytest");
}

static void Run(string str)
{
Console.WriteLine(str);
}
}

/// <summary>
/// 这就是一个委托的定义
/// </summary>
/// <param name="str"></param>
delegate void MyAction(string str);
}

弊端: 写的代码量过多,在于我还必须要手写一个显示的方法(Run),那有没有好的办法让我不写显式的方法。

2. 匿名委托

那么匿名委托就是在Run方法上面开刀。

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyAction action = delegate(string str)
{
Console.WriteLine(str);
};
}
}

/// <summary>
/// 这就是一个委托的定义
/// </summary>
/// <param name="str"></param>
delegate void MyAction(string str);
}

可以看到,已经成功的把显式方法去掉了,上面就是一个典型的匿名方法,其中有delegate包装了起来,

现在可以动刀的地方就是匿名函数:
MyAction action = delegate(string str)
{
Console.WriteLine(str);
};

有没有这种方法呢??? 有的,那就是lambda表达式。。。。

3.lambda表达式

MyAction action = str => Console.WriteLine(str);

通过对比,发现原来可以向参数声明,大括号,delegate都可以踢掉。。。

我们成功的将代码从 27 优化到了 24行。。。。

4. 还有优化的空间吗???

看了代码之后,惟一可以优化的地方就是delegate声明。

因为FCL中给我们定义了三个系统委托,一个叫做Action,一个叫做Func,一个叫做Predicate。

我们把delegate删掉之后,用了一个系统委托,成功的将代码从24号优化到了18行。

本质上来说,我们将曾今10几行的代码 成功的优化到了1行。

没有编译器的帮忙,绝对不能优化到这样的极致。

5. Action 封装一个方法,该方法只有一个参数并且不返回值。

通过ILSpy可以看到,Action最多接受8个参数。。。

【重点在于无返回值】

6. Func 封装一个不具有参数但却返回 TResult 参数指定的类型值的方法。

【重点再于有返回值】

7.Predicate 入参的类型随意,返回值必须是bool,

从整个演化的过程来看,它就是一个代码优化,代码压缩的过程,并且非常具有优雅性。

原文地址:https://www.cnblogs.com/Spinoza/p/11621704.html

时间: 2024-10-31 19:07:08

linq-匿名方法,匿名委托,lambda演化的相关文章

匿名方法就是委托

当对2个数实现加减乘除,其中的一个解决方案是通过委托来实现.如下: class Program { private delegate int CaculateDel(int num1, int num2); static void Main(string[] args) { CaculateDel caculateDel = Add; Console.WriteLine(caculateDel.Invoke(1,2).ToString()); Console.ReadKey(); } stati

多播委托和匿名方法再加上Lambda表达式

多播委托就是好几个方法全都委托给一个委托变量 代码: 1 namespace 委托 2 { 3 class Program 4 { 5 static void math1() 6 { 7 Console.WriteLine("这是第一个方法"); 8 } 9 10 static void math2() 11 { 12 Console.WriteLine("这是第二个方法"); 13 } 14 15 static void Main(string[] args) 1

温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件

一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本的数据类型(或者没有参数),比如 public void HelloWorld() { Console.WriteLine("Hello World!"); } public void HelloWorld(string name) { Console.WriteLine("Hello ,{0}!", name); } 但是有些时候,我们希望把一

linq和匿名方法、委托、匿名委托、lambda

委托相当于JavaScript中的闭包,c++中的函数指针. c#为了引进这个函数指针,将其进行包装成“委托”,同时将非托管的变成托管的. 1.最初的委托该怎么用 弊端:写的代码量过多,还要写一个显示的方法(Run). 2.匿名委托 直接将方法体赋予委托实例. 3.lambda表达式 s是参数,只有一个参数时可省略小括号:方法体只有一句时,可以省略大括号. 4.还能继续优化吗 原文地址:https://www.cnblogs.com/1016391912pm/p/11978800.html

委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录下来,以备复习使用. 委托: 日常工作中,常常见到委托用在具体的项目中.而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下: class Program { public delegate int CalculateDelegate(int x, int y)

委托,匿名方法,Lambda,泛型委托,表达式树

一.委托:完成一个委托应分三个步骤://step01:首先用delegate定义一个委托;public delegate int CalculatorAdd(int x, int y);//step02:声明一个方法来对应委托.public int Add(int x, int y){ return x + y;}protected void FrmTest_Load(object sender, EventArgs e){ //step03:用这个方法来实例化这个委托. CalculatorA

.NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以,跟着本篇的步伐,继续来围观. /* 新语法索引 */ 1.自动属性 Auto-Implemented Properties 2.隐式类型 var 3.参数默认值 和 命名参数 4.对象初始化器 与 集合初始化器 { } 5.匿名类 & 匿名方法 6.扩展方法 7.系统内置委托 Func / Acti

匿名类、匿名方法、扩展方法

/* 新语法索引 */ 1.自动属性 Auto-Implemented Properties 2.隐式类型 var 3.参数默认值 和 命名参数 4.对象初始化器 与 集合初始化器 { } 5.匿名类 & 匿名方法 6.扩展方法 7.系统内置委托 Func / Action 8.Lambda表达式 9.标准查询运算符 Standard Query Operator 10.LINQ查询表达式 一.匿名类 1.1 不好意思,我匿了 在开发中,我们有时会像下面的代码一样声明一个匿名类:可以看出,在匿名

方法组转换和匿名方法

前面的文章介绍过,C# 1.0中出现委托这个核心概念,在C# 2.0中,委托得到了很大的改进.C# 2.0中委托的改进为C# 3.0中的新特性提供了铺垫,当我们了解了匿名方法后,Lambda的学习就会变得相对容易. 下面就看看C# 2.0中委托的改进. 方法组转换 在C# 1.0中,如果要创建一个委托实例,就必须同时指定委托类型和符合委托签名的方法.但是,在C# 2.0中,支持了方法组转换,也就是说我们可以从方法组到一个兼容委托类型的隐式转换.所谓"方法组"(method group)