lambda表达式其本质就是一个方法(函数),或者狭义的说是一个匿名方法

Lambda就是======简写。

 

 

Lambda表达式的发展史--简写过程--变过程

06-01 C# Lambda表达式的发展史_菜鸟爱飞不飞的博客-CSDN博客

lambda表达式其本质就是一个方法(函数),或者狭义的说是一个匿名方法

 

1.0时代,如果要写一个lambda表达式,需要分三步:

1. 需要定义一个委托和一个方法

2. 实例化一个委托时将这个方法传递过去

3. 最后执行这个委托

 

2.0时代,如果要写一个lambda表达式,也需要分三步,但是在传递函数的时候有所区别,不需要单独定义方法

1. 定义一个委托

2. 在实例化委托时,直接传递一个delegate关键字修饰的匿名方法

3. 执行委托

这样也带来了一个优点:可以访问到除了参数以外的局部变量

3.0初期版本中的形态

3.0初期版本,对lambda表达式进一步简化

1. 定义一个委托

2. 在实例化委托时,去掉了delegate关键字,在参数和方法体之间使"=>"连接(读作goes to)

3. 执行委托

 

再到后来,进一步进行简化,逐渐接近现在我们所熟知的写法:

 

去掉参数类型,由编译器自动判断参数类型

如果lambda表达式只有一行,则可以省略大括号

实例化委托时,等号右边可以直接是lambda表达式,省略了new 委托

lambda表达式只有一个参数的时候,可以直接省略掉参数的括号

如果lambda表达式中只有一行代码,而且有返回值,可以直接省略 return 关键字

 

C# 匿名类var

目录

一、诞生

二、普通类的实例化

三、object匿名类

1、优点

2、缺点

3、思考

四、动态类型匿名类

1、优点

2、缺点

3、思考

五、弱类型(不确定类型)匿名类

1、优点

2、缺点

3、思考

4、使用场景

六、本文代码

一、诞生

framework 3.0版本开始支持匿名类

 

二、普通类的实例化

普通类型实例化之后,可以访问其中的属性和方法

 

/// <summary>

/// 普通类

/// </summary>

public void InstacePerson()

{

    Console.WriteLine("=========================普通类=====================");

    //通常实例化对象都是如下

    Person person = new Person()

    {

        Id = 1,

        Name = "张三"

    };

    //如此以来,我们还可以获取实例对象的属性和修改属性值

    Console.WriteLine(person.Name);

    person.Name = "李四";

    Console.WriteLine(person.Name);

    //还可以访问实例方法

    person.Hello();

}

 

 

三、object匿名类

1、优点

同样可以声明任何属性

2、缺点

不能访问其中的属性

3、思考

为什么明明声明了Id属性,但是为什么访问不到呢?

因为C#强类型语言,object是在编译时确定类型,上面的匿名类会被编译器认为是object类型,但是众所周知object实际上没有该属性,所以编译器不允许获取

 

/// <summary>

/// object匿名类

/// </summary>

public void InstanceObject()

{

    Console.WriteLine("=========================object匿名类=====================");

    //object匿名类的实例化如下,同样可以指定任何属性

    object model = new

    {

        Id = 1,

        Name = "张三",

        Age = 30

    };

 

    //object接收匿名类,缺点在于不能访问其中的属性

    //Console.WriteLine(model.Id);  //这是访问不到的,会报错

 

    //思考:为什么明明声明了Id属性,但是为什么访问不到呢?

    //因为C#强类型语言,object是在编译时确定类型,上面的匿名类会被编译器认为是object类型,但是众所周知object实际上没有该属性,所以编译器不允许获取

}

 

 

四、动态类型匿名类

1、优点

同样可以指定任何属性

不仅可以访问其中的属性,还可以给属性赋值

2、缺点

只能访问和修改已经声明的属性,若访问未声明的属性运行时就会报错

3、思考

为什么呢?动态类型和object的区别在于哪里?

因为动态类型dynamic试运行时确定类型,所以它可以避开编译器的检查,当程序运行时,就会确定类型,然后检查是否能够访问到相关的属性,如果访问未声明的属性就会报错(因为根本就找不到)

 

/// <summary>

/// 动态类型匿名类

/// </summary>

public void InstanceDynamic() {

    Console.WriteLine("=========================动态类型匿名类=====================");

    //动态类型匿名类的实例化如下,同样可以指定任何属性

    dynamic model = new

    {

        Id = 1,

        Name = "张三",

        Age = 30

    };

    //动态类型匿名类不经可以访问其中的属性,还可以给属性赋值

    Console.WriteLine(model.Id);

    model.Name = "李四";

    //但是他只能访问和修改已经声明的属性,若访问未声明的属性就会报错

    Console.WriteLine(model.Gender);

 

    //思考:为什么呢?动态类型和object的区别在于哪里?

    //因为动态类型dynamic试运行时确定类型,所以它可以避开编译器的检查,当程序运行时,就会确定类型,然后检查是否能够访问到相关的属性,如果访问未声明的属性就会报错(因为根本就找不到)

}

 

五、弱类型(不确定类型)匿名类

1、优点

同样可以指定任何属性

弱类型可以访问其中存在的属性(只读)

2、缺点

不能修改属性

var类型必须有初始值,不能为null,因为var 本来就不知道是什么类型,所以,如果右边也是null,那编译器就不可能推算出其具体类型

var也不允许作为参数类型,原因如上

代码可读性差(对性能无影响)

3、思考

vardynamicobject的区别?

var其实是一个语法糖,编译器可以通过等号右边的类型自动推断出实际类型

 

4、使用场景

配合匿名类使用

声明复杂类型的时候可以使用var(可以偷懒,不用知道其具体类型)

在不知道具体的类型的时候可以用var

/// <summary>

/// 弱类型(不确定类型)匿名类(var

/// </summary>

public void InstanceVar()

{

    Console.WriteLine("=========================弱类型(不确定类型)匿名类=====================");

    //动态类型匿名类的实例化如下,同样可以指定任何属性

    var model = new

    {

        Id = 1,

        Name = "张三",

        Age = 30

    };

    //弱类型可以访问其中存在的属性(只读)

    Console.WriteLine(model.Id);

    //但是不能修改属性

    //model.Name = "李四";

 

    //var 类型必须有初始值,不能为null,因为var 本来就不知道是什么类型,所以,如果右边也是null,那编译器就不可能推算出其具体类型,下面两种都不行

    //var a = null;

    //var b;

 

    //var也不允许作为参数类型,原因如上

    //void Test(var i) { }

 

 

    //思考:vardynamicobject的区别?

    //var其实是一个语法糖,编译器可以通过等号右边的类型自动推断出实际类型

 

    /**

     * var的使用场景:

     * 1、配合匿名类使用

     * 2、声明复杂类型的时候可以使用var(可以偷懒,不用知道其具体类型)

     * 3、在不知道具体的类型的时候可以用var

     *

     * 缺点:

     * 代码可读性差(对性能无影响)

     */

}

 

 

扩展方法

06-03 C# 扩展方法_菜鸟爱飞不飞的博客-CSDN博客