今天主要是对上一节所说的C#3.0的新特性做些补充:对象及集合初始化表达式、匿名类型、局部方法以及查询表达式。这些特性在LINQ中使用也很频繁,尤其是查询表达式。

  1.对象初始化表达式允许开发者在一条语句中给一个对象的一个或多个域或属性进行初始化赋值。这是在C#3.0之后新添加的特性,在这之前只能对C#基本类型或数组进行初始化赋值。示例如下:

(1)自定义类(点和圆):

View Code

 1 //点 2 publicclass Point 3     { 4 //x坐标 5 publicint X { get; set; } 6  7 //y坐标 8 publicint Y { get; set; } 9     }10 11 //圆12 publicclass Circle13     {14 //半径15 privatedouble radius;16 publicdouble Radius17         {18 set { radius = value; }19 get { return radius; }20         }21 22 //圆心23 private Point center;24 public Point Center25         {26 set { center = value; }27 get { return center; }28         }29 30 //计算面积31 publicdouble Area()32         {33 return Math.Pow(radius, 2) * Math.PI;34         }35     }

(2)使用对象初始化表达式:

 1 staticvoid Main(string[] args) 2         { 3 //对象初始化表达式 4             Circle circle =new Circle() 5             { 6                 Center =new Point()//嵌套对象初始化表达式 7                 { 8                     X =10, 9                     Y =1010                 },11 12                 Radius =513             };14             15             Console.WriteLine("圆面积:"+circle.Area());16 17             Console.Read();18         }

(3)结果:

(2)中对象初始化表达式来进行初始化对象和用下述示例代码的初始化编译后的代码是一样的:

1             Circle circle =new Circle();2             Point center =new Point();3             center.X =10;4             center.Y =10;5 //初始化圆心坐标6             circle.Center = center;7 //初始化半径8             circle.Radius =5;

由此看出对象初始化表达式类似于函数的形式来初始化对象比通过多句代码来初始化要简便得多。

  2.集合初始化表达式允许开发人员在一条语句中初始化一个集合对象,前提集合类型必须实现System.Collection.IEnumerable接口,并实现Add方法。以下我把集合初始化表达式和对象初始化表达相结合起来作为示例来说明:

 1 staticvoid Main(string[] args) 2         { 3 //集合初始化表达式 4             var circles =new List<Circle> 5             { 6 new Circle{Center=new Point{X=1,Y=1},Radius=2}, 7 new Circle{Center=new Point{X=2,Y=2},Radius=4}, 8 new Circle{Center=new Point{X=3,Y=3},Radius=6}, 9             };10 11 foreach (var c in circles)12             {13                 Console.WriteLine(string.Format("半径为{0}的圆面积:{1}" ,c.Radius, c.Area()));14             }15 16             Console.Read();17         }

结果:

上述用集合初始化表达式初始化集合对象和下述代码初始化是一样的:

 1 //定义圆对象 2             Circle cir; 3 //定义圆心 4             Point center; 5 //定义圆集合 6             var circles =new List<Circle>(); 7  8 //初始化圆 9             cir =new Circle();10             center =new Point();11             center.X =1;12             center.Y =1;;13             cir.Center = center;14             cir.Radius =2;15 //添加圆对象入集合16             circles.Add(cir);17 18             cir =new Circle();19             center =new Point();20             center.X =2;21             center.Y =2; ;22             cir.Center = center;23             cir.Radius =4;24             circles.Add(cir);25 26             cir =new Circle();27             center =new Point();28             center.X =3;29             center.Y =3; ;30             cir.Center = center;31             cir.Radius =6;32             circles.Add(cir);

由此可见使用对象初始化表达式和集合初始化表达式可以大大减少代码的编写。

  3.跟对象初始化表达式一样的方式,可以创建匿名类型,它一般用于在不自定义一个类的前提下,将数据组合成一个对象。如下示例所示:

 1 staticvoid Main(string[] args) 2         { 3            Circle cir1 =new Circle { Center =new Point {X=1,Y=1 },Radius=2 }; 4            var cir2=new{Center=new Point {X=1,Y=1 },Radius=2 };//匿名类型 5            var cir3 =new { cir1.Center, cir1.Radius };//匿名类型 6            var cir4 =new { cir1.Radius, cir1.Center };//匿名类型 7  8            Console.WriteLine("匿名对象cir2:{0}", cir2.GetType()); 9            Console.WriteLine("匿名对象cir3:{0}", cir3.GetType());10            Console.WriteLine("匿名对象cir4:{0}", cir4.GetType());11 12            Console.Read();13         }

结果:

从结果中可以看到匿名类型会自动创建新类,新类的名称是从对象初始化器本身推断出来的,这种推断的语法叫做初始化投影。另外因为cir2和cir3有相同的字段和属性,且顺序相同,所以两者是相同的匿名类型。而cir4和cir3因为属性的顺序不同,导致编译器产生了不同的匿名类型。

  4.大家都知道在C#中有个关键字Partial(局部),是用来修饰class类的,成为局部类,现在C#3.0语言新添加了Partial Methods(局部方法),它是一个轻量级事件处理机制。局部类和局部方法唯一的关联就是局部方法必须定义在局部类中。并且局部方法的定义和实现可以分开。我用以下示例来具体说明:

(1)声明局部类:

 1 //局部类 2 publicpartialclass PartialClass 3     { 4 //定义局部方法 5 partialvoid partialMethod(); 6  7 public PartialClass() 8         { 9             partialMethod();//调用局部方法10         }11  12     }13 14 //局部类15 publicpartialclass PartialClass16     {17 //局部方法实现部分18 partialvoid partialMethod()19         {20             Console.WriteLine("调用局部方法");21         }22     }

(2)建立局部类对象:

View Code

1 staticvoid Main(string[] args)2         {3             PartialClass pc =new PartialClass();4             5             Console.Read();6         }

(3)结果:

不仅局部方法的定义和实现可以分开,甚至只有方法的定义没有方法的实现也可以。只不过在这种情况下,编译器在编译局部代码时不会产生任何IL(中间代码)代码,就像方法不存在一样。把上述代码中的局部方法实现部分去掉:

 1 //局部类 2 publicpartialclass PartialClass 3     { 4 //定义局部方法 5 partialvoid partialMethod(); 6  7 public PartialClass() 8         { 9             partialMethod();//调用局部方法10         }11  12     }

就不会产生任何的输出结果。局部方法被Linq To SQL作为一种轻量级事件来处理。在Linq To SQL自动生成的实体类中,每一个与数据库中字段相对应的属性值在修改之前会自动调用局部方法,在修改之后又会调用另一个局部方法。作为开发人员可以自己定义这两个局部方法的实现代码,当然也可以不定义实现部分,这本质上类似于一种事件处理机制。现对局部方法总结如下:(1)局部方法只能定义和实现在局部类中;(2)局部方法需用关键字partial来修饰;(3)局部方法是私有的,但不能用private来修饰;(4)局部方法的返回值必须为void;(5)局部方法可以没有实现部分;(6)局部方法可以是静态的;(7)局部方法可以有参数;

  5.最后来说说查询表达式,它也是LINQ使许多开发人员爱不释手的原因之一。并且查询表达式包括许多之前讲到过的C#3.0语言新的特性。示例如下:

 1 staticvoid Main(string[] args) 2         { 3           var Sprites =new[]{ 4 new {Profession="法师",Weapon="魔杖",Blood=200}, 5 new {Profession="战士",Weapon="屠龙刀",Blood=1000}, 6 new {Profession="导师",Weapon="倚天剑",Blood=500} 7             }; 8  9 //查询表达式:查找血量大于300的精灵职业,且按血量的升序排列10             var query = from s in Sprites11 where s.Blood >30012                         orderby s.Blood13                         select new { Profession = s.Profession };14 15 foreach (var s in query)16             {17                 Console.WriteLine("血量大于300的精灵职业:{0}", s.Profession);18             }19             20             Console.Read();21         }

结果:

查询表达式以from关键字开始,以select或group关键字结束,from关键字后操作的对象必须实现IEnumerable<T>接口的类的实例。上述的查询表达式还可以写成这样:

1  var query = Sprites2              .Where(s => s.Blood >300)3              .OrderBy(s => s.Blood)4              .Select(s =>new { Profession = s.Profession });

前者通过编译器翻译后生成上述这样等价的语句,所以查询表达式包括Lamdba表达式、扩展方法(如:Where和OrderBy方法)、对象初始化表达式、匿名类型和局部类型推断var等。因为查询表达式是LINQ技术中是最常用的,所这些C#3.0的新特性是LINQ技术底层实现的基础。因此掌握了这些C#语言特性在之后进一步学习LINQ就会显得轻松许多。

转载于:https://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/29/2157996.html

LINQ学习之旅——准备(C#3.0新特性补充)相关推荐

  1. LINQ学习之旅——最后一站LTX之基础和编程接口所包含类的简介

    对LINQ TO SQL的内容讲解将告一段落,下面我们进入LINQ学习之旅的最后一站"LTX",即LINQ TO XML.当前XML技术在应用开发中显得越来越重要,已成为各类数据交 ...

  2. 大数据技术之_11_HBase学习_03_HBase 实战之谷粒微博(练习API) + 扩展知识(布隆过滤器+HBase2.0 新特性)

    大数据技术之_11_HBase学习_03 第8章 HBase 实战之谷粒微博 8.1 需求分析 8.2 代码实现 第9章 扩展知识 9.1 HBase 在商业项目中的能力 9.2 布隆过滤器 9.3 ...

  3. 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】

    深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...

  4. 【收藏】C# 2.03.0新特性总结

    c#2.0新特性 范型 我们知道通用的数据结构可以采用object存储任何数据类型.使用object问题是: 显示的强制转带来的代码复杂性 换装箱拆箱的性能损失(为什么有性能损失?因为涉及动态内存分配 ...

  5. [转]C# 2.0新特性与C# 3.5新特性

    C# 2.0新特性与C# 3.5新特性 一.C# 2.0 新特性: 1.泛型List<MyObject> obj_list=new List(); obj_list.Add(new MyO ...

  6. Servlet 3.0 新特性概述

    Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...

  7. WCF4.0新特性体验(3):标准终结点(Standard Endpoints)

    今天在WCF4.0新特性体验第3节,我们介绍WCF4.0里的标准终结点概念,也就是Standard Endpoints. WCF4.0提供了那些标准终结点?他们有什么作用?如何使用标准终结点?如何该表 ...

  8. 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API

    返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API 原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 ...

  9. 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数

    [索引页] [源码下载] 精进不休 .NET 4.0 (4) - C# 4.0 新特性之命名参数和可选参数, 动态绑定(dynamic), 泛型协变和逆变, CountdownEvent, Barri ...

最新文章

  1. CentOS安装tomcat
  2. GNU make manual 翻译( 一百八十一)
  3. Django REST framework (DRF) 不能用property或method排序
  4. java序列化和反序列化_Java恶意序列化背后的历史和动机
  5. ACGAN(Auxiliary Classifier GAN)详解与实现(tensorflow2.x实现)
  6. SQL常用脚本大全,建议收藏!
  7. 作用域和作用域链 精解
  8. Python学习总结(10) python中数据的常用操作之切片和迭代
  9. Scene Kit (翻译)
  10. 【语音唤醒】MDTC:Multi-scale dilated temporal convolutional network
  11. 【自动化】国内自动化与信息化产业仍有十年以上的产业繁荣;非标自动化业务你离BOSS只差一个认知
  12. 统计建模-多元线性回归预测房价
  13. 五大经典算法-动态规划 及其算法应用
  14. linux软件都能安装在Uos,在uos 20/deepin V20中添加华为软件源,就能打开应用商店和安装软件...
  15. 标签体系,这么做才有实用价值
  16. 校园学校排课选课系统 毕业设计毕设源码毕业论文开题报告参考(2)班主任辅导员功能
  17. python抓取国家统计局省市区街道社区数据
  18. 安全左移理念,腾讯DevSecOps如何实践?
  19. 必应地图图片系统(Tile System)之二
  20. 通过Gromacs做Lysozyme在水中的模拟

热门文章

  1. ROS学习笔记12(用Python写一个简单的消息发布和消息订阅)
  2. windows 打开exe传参_“以管理员身份运行”,这个打开软件时经常遇到的问题,有何含义...
  3. ant如何形成时间轴和图库_如何让景观设计更具有逻辑性?
  4. Python安装与库导入
  5. java解析csv文件工具类,java操作CSV文件工具类
  6. 测试面试题集-生活物品测试:杯子、伞、钢笔、桌子
  7. 软件测试入门笔记(一)
  8. The package lists or status file could not be parsed or opened.
  9. Amber Group创始人兼CEO Michael Wu:CBDC将成为更广义、重要的加密资产
  10. SAP License:COPA计划