• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C# 3.0 之新特性总结

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

   

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/*成员访问*/};//匿名类型包含NameP1两个只读成员

       var testType = new { r/*简单名称*/, i = 0 };//匿名类型包含ri两个只读成员

注意: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" };              // 编译错误,intstring不能进行隐式转换,这种情况必须显示的指定数组类型,如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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#操作SQL Server中的Image类型数据发布时间:2022-07-10
下一篇:
C#基础之进程管理发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap