2.一个叫做Lambda 的【方法-函数】语法糖--本身就是【简写】。
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、思考
var与dynamic和object的区别?
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) { }
//思考:var与dynamic和object的区别?
//var其实是一个语法糖,编译器可以通过等号右边的类型自动推断出实际类型
/**
* var的使用场景:
* 1、配合匿名类使用
* 2、声明复杂类型的时候可以使用var(可以偷懒,不用知道其具体类型)
* 3、在不知道具体的类型的时候可以用var
*
* 缺点:
* 代码可读性差(对性能无影响)
*/
}
扩展方法
06-03 C# 扩展方法_菜鸟爱飞不飞的博客-CSDN博客