C# 3.0语言特性
2015-05-17 21:23
176 查看
关键字:隐式类型变量var、扩展方法(extension method)、lambda表达式、自动属性、匿名类型
一、隐式类型
C#是强类型语言,意味着我们在声明变量时必须指定变量的具体类型,但是var可以代替正式的数据类型名(如int, bool, string),编译器会根据用于初始化局部变量的初始值推断出变量的数据类型;我们可以对基类库中的所有类型使用隐式类型,包括数组、泛型、自定义类型。
使用限制:
1、只能应用与方法或者属性内局部变量的声明,不能使用var来定义返回值、参数的类型或类型的数据成员;
2、使用var进行声明的局部变量必须赋初始值,并且不能以null作为初始值。
强类型数据:隐式类型初始化后编译器就已经推断出了确切类型,所以他是强类型。
作用:可以动态根据查询本身的格式来创建结果集,这样我们就不需要显示定义查询可能返回的类型
二、自动属性
因为.NET基类库总是使用类型属性而不是传统的访问和修改方法,所以.NET语言推荐使用类型属性来封装私有数据字段,而不是 使用GetXXX()和SetXXX()方法。
在底层,C#属性会被映射到前缀get_和set_的方法中,即如果定义了Name属性,C#会自动生成get_Name()和set_Name()方法。
在定义自动属性时候,必须同时提供Get和Set关键字。
三、匿名类型
类可以表达一个给定的编程实体,我们通常创建一个C#类,为该类提供必需的一系列属性、方法和事件等,以供重用;而有时候可能需要定义类来封装一些相关数据,而不需要任何相关联的方法、事件,或者该类不需要在项目间重用。
C# 3.0提供的匿名类型,使用新的关键字var和之前介绍的对象初始化语法,如:var worker = new { FirstName = "Vincent", LastName = "Ke", Level = 2 };C#编译器会在编译时自动生成名称唯一的类。因为这个类的名字在C#中是不可见的,所以必需使用var关键字来使用隐式类型化。
匿名类型内部表示:
匿名类型都自动继承自System.Object,可以调用ToString()、GetHashCode()、Equals()、GetType()方法
四、扩展方法
在 C#3.0 推出扩展方法之前,一旦一个类被编译进程序集后,便不能再修改该类型的定义了;为该类型添加、修改、删除成员的唯一办法就是修改类型的定义代码。当需要为类型添加新功能但并不拥有类型的已有代码时,比如,我们想要为.NET库类型List添加自定义的dump方法时,该怎么做呢,答案是扩展方法。扩展方法允许在不修改类型定义的情况下,让该类型获得功能上的扩展
定义扩展方法:
1、必须把方法定义在静态类中,因此每一个扩展方法也必须声明为静态的;
2、要用this关键字对第一个参数进行修饰,这个参数也就是我们希望进行扩展的类型。
调用扩展方法:
两种方式来使用扩展方法:实例调用 和 静态调用。通过一个对象调用它的扩展方法只是编译器的烟幕弹效果而已,背后编译器会转换成静态方法的调用
五、Lambda表达式
Lambda表达式的引入是与委托类型的使用密切相关的,本质上,Lambda表达式只是用更简单的方式来书写匿名方法,从而彻底简化.NET委托类型的使用
Lambda表达式可以应用于任何匿名方法可以应用的场合,而且比匿名方法更加简洁更节省编码时间。C#编译器只是把Lambda表达式翻译为相应的普通匿名方法而已。
Lambda表达式的格式:先定义参数列表,”=>”标记(可读为:goes to)紧随其后,然后是表达式。即:ArgumentsToProcess => StatementsToProcessThem
Lambda表达式的参数可以是显示类型化的也可以是隐式类型化的
Lambda表达式也可以是一个代码块,其中包含多条代码语句,用花括号括起来即可
六、对象初始化器
一、隐式类型
C#是强类型语言,意味着我们在声明变量时必须指定变量的具体类型,但是var可以代替正式的数据类型名(如int, bool, string),编译器会根据用于初始化局部变量的初始值推断出变量的数据类型;我们可以对基类库中的所有类型使用隐式类型,包括数组、泛型、自定义类型。
使用限制:
1、只能应用与方法或者属性内局部变量的声明,不能使用var来定义返回值、参数的类型或类型的数据成员;
2、使用var进行声明的局部变量必须赋初始值,并且不能以null作为初始值。
强类型数据:隐式类型初始化后编译器就已经推断出了确切类型,所以他是强类型。
作用:可以动态根据查询本身的格式来创建结果集,这样我们就不需要显示定义查询可能返回的类型
二、自动属性
因为.NET基类库总是使用类型属性而不是传统的访问和修改方法,所以.NET语言推荐使用类型属性来封装私有数据字段,而不是 使用GetXXX()和SetXXX()方法。
在底层,C#属性会被映射到前缀get_和set_的方法中,即如果定义了Name属性,C#会自动生成get_Name()和set_Name()方法。
在定义自动属性时候,必须同时提供Get和Set关键字。
三、匿名类型
类可以表达一个给定的编程实体,我们通常创建一个C#类,为该类提供必需的一系列属性、方法和事件等,以供重用;而有时候可能需要定义类来封装一些相关数据,而不需要任何相关联的方法、事件,或者该类不需要在项目间重用。
C# 3.0提供的匿名类型,使用新的关键字var和之前介绍的对象初始化语法,如:var worker = new { FirstName = "Vincent", LastName = "Ke", Level = 2 };C#编译器会在编译时自动生成名称唯一的类。因为这个类的名字在C#中是不可见的,所以必需使用var关键字来使用隐式类型化。
匿名类型内部表示:
匿名类型都自动继承自System.Object,可以调用ToString()、GetHashCode()、Equals()、GetType()方法
四、扩展方法
在 C#3.0 推出扩展方法之前,一旦一个类被编译进程序集后,便不能再修改该类型的定义了;为该类型添加、修改、删除成员的唯一办法就是修改类型的定义代码。当需要为类型添加新功能但并不拥有类型的已有代码时,比如,我们想要为.NET库类型List添加自定义的dump方法时,该怎么做呢,答案是扩展方法。扩展方法允许在不修改类型定义的情况下,让该类型获得功能上的扩展
定义扩展方法:
1、必须把方法定义在静态类中,因此每一个扩展方法也必须声明为静态的;
2、要用this关键字对第一个参数进行修饰,这个参数也就是我们希望进行扩展的类型。
static class MyExtensions { // 本方法允许任何对象显示它所处的程序集 public static void DisplayDefiningAssemlby(this object obj) { Console.WriteLine("{0} is defined in: \n\t {1}\n", obj.GetType().Name, System.Reflection.Assembly.GetAssembly(obj.GetType())); } }
调用扩展方法:
两种方式来使用扩展方法:实例调用 和 静态调用。通过一个对象调用它的扩展方法只是编译器的烟幕弹效果而已,背后编译器会转换成静态方法的调用
五、Lambda表达式
Lambda表达式的引入是与委托类型的使用密切相关的,本质上,Lambda表达式只是用更简单的方式来书写匿名方法,从而彻底简化.NET委托类型的使用
Lambda表达式可以应用于任何匿名方法可以应用的场合,而且比匿名方法更加简洁更节省编码时间。C#编译器只是把Lambda表达式翻译为相应的普通匿名方法而已。
Lambda表达式的格式:先定义参数列表,”=>”标记(可读为:goes to)紧随其后,然后是表达式。即:ArgumentsToProcess => StatementsToProcessThem
Lambda表达式的参数可以是显示类型化的也可以是隐式类型化的
Lambda表达式也可以是一个代码块,其中包含多条代码语句,用花括号括起来即可
// 使用语句块编写Lambda表达式 List<int> evenNumbers = list.FindAll((int i) => { Console.WriteLine("processing value: {0}", i); bool isEven = (i % 2) == 0; return isEven; });
六、对象初始化器
static void ObjectInitSyntax() { // 在这里,默认构造函数被隐式调用 Point bPoint = new Point { X = 10, Y = 20 }; // 我们也可以显示调用默认构造函数 Point cPoint = new Point() { X = 10, Y = 20 }; // 我们还可以调用自定义的构造函数,只是这里1, 2会被10, 20覆盖 Point dPoint = new Point(1, 2) { X = 10, Y = 20 }; }
相关文章推荐
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- LINQ体验(3)——C# 3.0新语言特性和改进(下篇)
- C# 3.0新语言特性和改进(一)
- LINQ体验(2)--C# 3.0新语言特性和改进(上篇)
- C# 3.0语言新特性(语言规范):8 表达式树
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇) 【转】
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- C# 3.0 新语言特性和改进
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- C# 3.0语言新特性(一)
- C# 3.0新语言特性和改进
- c# 3.0 语言的新特性(三)
- LINQ体验(3)--C# 3.0新语言特性和改进(下篇)
- (转)C# 3.0语言的新特性——Lambda表达式
- LINQ体验(3)——C# 3.0新语言特性和改进(下篇)
- LINQ体验(3)——C# 3.0新语言特性和改进(下篇) 【转】
- LINQ体验(3)——C# 3.0新语言特性和改进(下篇)
- LINQ体验(3)——C# 3.0新语言特性和改进(下篇)
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
- C# 3.0语言新特性(二)