在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
C# 3.0 之新特性总结 LazyBee 现在VS2008已经发布,而且很多人也都开始使用C# 3.0了,我在这里对其新特性做一个总结,以方便自己日后或同仁参考: 1 隐式类型本地变量(var) 这个和以前VB6中的全能类型var使用了同样的名字,但在C#中,其实var不是一个实际类型,可以说是一个标记,就是让编译器去根据初始化的内容来确定需要使用的合适的类型。例如:var i = 5; 就等效于int i=5; 不过,隐式变量有以下几个限制: 1 隐式本地变量的声明必须同时包含一个初始化器。 2 初始化器必须是一个表达式,并且不能是对象或集合初始化器,但可以是包括new关键字以及对象或集合初始化器的组合表达式。例如:{1,2,3}是一个集合初始化器,如果你将其赋给一个隐式变量将出现编译错误。(var x={1,2,3}; //错误),但是你可以这样这样var x=new List<int>{1,2,3};是允许的。 3初始化器表达式在编译时不能为null.(例如:var i=null; //错误:不能为null) 4 由于是隐式本地变量,顾名思义,只能用于本地变量(在方法或属性中使用的变量). 5 如果在隐式类型本地变量的初始化器的表达式中包含其他声明变量(包括隐式类型的),那么这些变量必须是相同(或者可以隐式转换成相同)的编译时类型。 例如:var arrayD = new[] { 1, "one", 2, "two" };// 错误,不允许混合类型 var n = "java"; var m = 4; var ff = m + n; //正确 注意:foreanch中使用也是允许的,如: int[] numbers = { 1, 3, 5, 7, 9 }; foreach (var n in numbers) Console.WriteLine(n); 2 对象初始化器 对象初始化器用于指定对象的一个或多个可访问的字段或属性的值,通过{和}进行封闭起来,多个字段赋值之间通过逗号分割。具体语法元素是: Ø 对象创建表达式: new 类型(类型参数可选)对象或集合初始化器可选 new 类型 对象或集合初始化器 Ø 对象或集合初始化器: 对象初始化器 集合初始化器 Ø 对象初始化器: {对象成员初始化器列表} Ø 对象成员初始化器列表: 对象成员初始化器 对象成员初始化器列表,对象成员初始化器 Ø 对象成员初始化器: 标识符 = 初始化值 Ø 初始化值: 表达式 对象或成员初始化器 注意:对象或成员初始化器是可以嵌套的,并且初始化器是不包含new关键字的。初始化器不能用于结构,初始化器中每个成员最多只能初始化一次。示例:
1public class Point
2 请注意r2的初始化中的不同。 3 集合初始化器 语法表示: Ø 集合初始化器: {元素初始化器列表} Ø 元素初始化器列表: 元素初始化器 元素初始化器列表,元素初始化器 Ø 元素初始化器: 非赋值表达式 示例:
1
4匿名类型 C#3.0允许将new和一个匿名对象初始化器一起来创建一个匿名类型的对象。具体语法格式为: Ø 匿名对象创建表达式: new 匿名对象初始化器 Ø 匿名对象初始化器: {成员声明器列表} Ø 成员声明器列表: 成员声明器 成员声明器列表,成员声明器 Ø 成员声明器: 简单名称 成员访问 标识符=表达式(赋值表达式) 注:简单名称就是已经定义在当前范围可访问的标识符(变量名)。成员访问就是通过“.”分割的表达式。 实例: Rectangle r = new Rectangle() { P1 = { X = 5, Y = 6 }, P2 = { X = 7, Y = 8 } }; var anyType = new { Name = "Hello"/*赋值表达式*/, r.P1/*成员访问*/};//匿名类型包含Name和P1两个只读成员 var testType = new { r/*简单名称*/, i = 0 };//匿名类型包含r和i两个只读成员 注意:1 匿名类型中的成员都是只读的。 2 成员的类型根据赋值表达式来推导出实际类型(赋值表达式在编译时不能为null),不能在代码中指定成员类型。 3 如果两个匿名类型创建表达式的成员变量名相同,并且经过推导出的变量的类型和顺序也相同,那么这两个匿名类型对象是两个同一匿名类 型的实例,例如: var p1 = new { Name = "Lawnmower", Price = 495.00 }; var p2 = new { Name = "Shovel", Price = 26.95 }; p1 = p2; 5 隐式类型数组 隐式类型数组定义语法为: Ø 数组创建表达式: new [] 数组初始化器 隐式类型数组实例的类型是根据数组初始化器推导出来的,所以这个数组初始化器只能包含确切的一种类型(也可以包含可以隐式转换成这种类型的类型),而且这个类型不是null,否则将产生一个编译错误。 var a = new[] { 1, 10, 100, 1000 }; // int[] var b = new[] { 1, 1.5, 2, 2.5 }; // double[] var c = new[] { "hello", null, "world"}; // string[] var d = new[] { 1, "one", 2, "two" }; // 编译错误,int和string不能进行隐式转换,这种情况必须显示的指定数组类型,如object[] 隐式类型数组可以和匿名类型一块使用来创建匿名类型的数据结构:如: var contacts = new[] { new {Name = "Chris Smith",PhoneNumbers = new[]{ "206-555-0101", "425-882-8080" }}, new {Name = "Bob Harris",PhoneNumbers = new[] { "650-555-0199" }}}; 6 扩展方法: 扩展方法是可以使用实例名来调用的静态方法,是通过增加新的功能方法到已存在的类型中去的一种途径。扩展方法必须是声明在静态类中的静态方法,并且扩展方法的第一个参数必须带一个this关键字,然后就可以通过第一个参数类型的实例进行调用,也就是可以象实例方法一样调用。例如:
namespace LazyBee.Utilities
然后在你要调用扩展方法的地方导入LazyBee.Utilities命名空间,就可以象如下方式调用: string s = "1234"; int i = s.ToInt32(); // Same as Extensions.ToInt32(s) int[] digits = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int[] e = digits.Slice(4, 3); // Same as Extensions.Slice(digits, 4, 3) 注意: 1 实例方法优先于扩展方法的调用,也就是说只有不存在符合要求的实例方法,才会去查找时候存在扩展方法。 2 扩展方法具有一般静态方法所拥有的一切特性。 3 扩展方法比实例方法具有更多的限制,以及更低的优先级。所以要尽量少用扩展方法,建议只有在不能增加实例方法的情况下使用。 4 其他类型的扩展成员如属性、事件、操作目前不支持,不过微软正在考虑当中。 7 Lambda表达式: 6.1 Lambda表达式提供一种更精简的方式来写匿名方法,其语法格式为: Ø 表达式: 赋值表达式 非赋值表达式 Ø 非赋值表达式: 条件表达式 Lambda表达式 查询表达式 Ø Lambda表达式: (Lambda参数列表可选)=>Lambda表达式体 隐式类型Lambda参数=> Lambda表达式体 Ø Lambda参数列表: 显式类型Lambda参数列表 隐式类型Lambda
|
请发表评论