framework3.x&4.0 新特性

53
Framework3.x&4.0 新新新 新新新新新新 新新新 2011/08/30

Upload: clyde

Post on 21-Mar-2016

93 views

Category:

Documents


13 download

DESCRIPTION

Framework3.x&4.0 新特性. 信息化技术部 孙严军 2011/08/30. 目录. 扩展方法. 自动实现属性. 对象集合初始化器 \ 隐式类型数组. 匿名类型 \ 匿名方法 \ 匿名委托. 延迟加载. 命名实参和可选实参. var&dynamic 的方法. LINQ. Lambda. 扩展方法 Extension Methods. 概述. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Framework3.x&4.0 新特性

Framework3.x&4.0 新特性

信息化技术部 孙严军 2011/08/30

Page 2: Framework3.x&4.0 新特性

目录

对象集合初始化器 \ 隐式类型数组

扩展方法

延迟加载 命名实参和可选实参LINQ

var&dynamic 的方法

Lambda

匿名类型 \ 匿名方法 \ 匿名委托

自动实现属性

Page 3: Framework3.x&4.0 新特性

扩展方法 Extension Methods

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。

申明

概述

Page 4: Framework3.x&4.0 新特性

扩展方法 Extension Methods

调用

约束如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。 扩展方法必须定义在非泛型的静态类中。扩展方法必须申明为静态的。要扩展的类型前必须冠以 this 关键字。 扩展话题如果某个类型使用了扩展方法,使用反射可以获取该扩展方法吗 ?

Page 5: Framework3.x&4.0 新特性

扩展方法 Extension Methods

资料http://msdn.microsoft.com/zh-cn/library/bb383977.aspx(MSDN)http://www.cnblogs.com/ldp615/category/260324.html 鹤冲天博客《 C# 本质论》第四版

Page 6: Framework3.x&4.0 新特性

目录

自动实现属性扩展方法

匿名类型 \ 匿名方法 \ 匿名委托延迟加载

命名实参和可选实参LINQ

Var&dynamic 的方法

Lambda

对象集合初始化器 \ 隐式类型数组

Page 7: Framework3.x&4.0 新特性

自动实现属性 Auto-implemented properties

当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁。 客户端代码还可通过这些属性创建对象。 在运行时编译器将创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器进行访问。

申明

概述

扩展话题自动实现属性 Framework 中是如何实现的呢 ?

Page 8: Framework3.x&4.0 新特性

自动实现属性 Auto-implemented properties

资料http://msdn.microsoft.com/zh-cn/library/bb384054.aspx (MSDN)《 C# 本质论》第四版

Page 9: Framework3.x&4.0 新特性

目录

对象集合初始化器 \ 隐式类型数组

扩展方法

匿名类型延时加载

命名实参和可选实参LINQ

var&dynamic

Lambda

自动实现属性

Page 10: Framework3.x&4.0 新特性

对象集合初始化器 \ 隐式类型数组 Initializer

对象集合初始化器 (Object and Collection Initializers) 使用对象初始值设定项可以在创建对象时向对象的任何可访问的字段或属性分配值,而无需显式调用构造函数。

对象初始化器 Object Initializer

概述

集合初始化器 Collection Initializer

Page 11: Framework3.x&4.0 新特性

对象集合初始化器 \ 隐式类型数组 Initializer

扩展话题

隐式类型数组 Array Initializer

为什么可以使用 new [Object]{Property=Value} 的方式可以初始化对象 \ 集合 \ 数组呢? 解析 :1 、在 C# 中编写代码段 :

Page 12: Framework3.x&4.0 新特性

对象集合初始化器 \ 隐式类型数组 Initializer

2 、使用 Reflector 工具反编译查看源代码

3 、结论

资料http://msdn.microsoft.com/zh-cn/library/bb384062.aspx (MSDN)《 C# 本质论》第四版

Page 13: Framework3.x&4.0 新特性

目录

匿名类型 \ 匿名方法 \ 匿名委托

扩展方法

延迟加载 命名实参和可选实参LINQ

var&dynamic 的方法

Lambda

自动实现属性对象集合初始化器 \ 隐式类型数组

Page 14: Framework3.x&4.0 新特性

匿名类型 \ 匿名方法 \ 匿名委托 Anonymous

匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 这些属性的类型由编译器推断。匿名类型是直接从对象派生的引用类型 , 唯一区别在于匿名类型无法强制转换为除 object 以外的任何类型。

匿名类型 Anonymous Type

如果两个或更多个匿名类型以相同的顺序具有相同数量和种类的属性,则编译器会将这些匿名类型视为相同的类型,并且它们共享编译器生成的相同类型信息。 匿名类型具有方法范围。

Page 15: Framework3.x&4.0 新特性

匿名类型 \ 匿名方法 \ 匿名委托 Anonymous

资料http://msdn.microsoft.com/zh-cn/library/bb397696.aspx (MSDN)

Page 16: Framework3.x&4.0 新特性

匿名类型 \ 匿名方法 \ 匿名委托 Anonymous

在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。 Framework 2.0 引入了匿名方法。要将代码块传递为委托参数,创建匿名方法则是唯一的方法。

匿名方法 \ 匿名委托 Anonymous Mmethod\Delegate

资料http://msdn.microsoft.com/zh-cn/library/0yw3tz5k(v=vs.80).aspx (MSDN)

Page 17: Framework3.x&4.0 新特性

目录

延迟加载

扩展方法

命名实参和可选实参LINQ

var&dynamic 的方法

Lambda

自动实现属性对象集合初始化器 \ 隐式类型数组匿名类型 \ 匿名方法 \ 匿名委托

Page 18: Framework3.x&4.0 新特性

延迟加载 LazyLoad

延迟加载就是推迟初例化对象。 Fx4.0 中提供了 Lazy<T> 类来实现延迟加载,主在要 ORM 中使用的比较广泛,并非 .Net Framework所独有的,在 JAVA语言或很多框架中都有用到如 IBatis.NET 、 Hibernate 、 NHibernate 、 Linq to SQL等。

概述

应用

Page 19: Framework3.x&4.0 新特性

延迟加载 LazyLoad

扩展话题使用 fx1.0 或 2.0 的方式如何实现延迟加载?

Page 20: Framework3.x&4.0 新特性

延迟加载 LazyLoad

资料 http://msdn.microsoft.com/zh-cn/library/bb399393.aspx 延迟加载与立即加载 http://www.cnblogs.com/kym/archive/2010/02/21/1670226.html

Page 21: Framework3.x&4.0 新特性

目录扩展方法

LINQ

var&dynamic 的方法

Lambda

自动实现属性对象集合初始化器 \ 隐式类型数组匿名类型 \ 匿名方法 \ 匿名委托延迟加载命名参数和可选参数

Page 22: Framework3.x&4.0 新特性

命名实参和可选实参 Named Arguments\Optional Parameters

概述

命名参数

Framework4.0 引入了命名实参和可选实参。命名参数在调用函数时可以通过指定参数名称的方式来调用参数。它最大的好处就是方便调用参数时按调用者的需要来排列顺序而不必死守函数声明时的顺序,同时结合默认参数值的特性,可以选择使用默认参数还是不使用默认参数。可选参数, CLR 在运行时,自动增加了相关的特性来告诉被调用的方法传什么样的参数,会调用什么样的方法(将在本章节的扩展话题是详解)。

Page 23: Framework3.x&4.0 新特性

命名实参和可选实参 Named Arguments\Optional Parameters

可选参数 示例 .

Page 24: Framework3.x&4.0 新特性

命名实参和可选实参 Named Arguments\Optional Parameters

可选参数方法的重载 .

可选参数重载策略 (摘自 CSDN) http://msdn.microsoft.com/zh-cn/library/dd264739.aspx 使用命名实参和可选实参将在以下方面对重载决策产生影响:

如果方法、索引器或构造函数的各个形参均为可选,或者按名称或位置与调用语句中的单个实参对应,并且该实参可转换为形参的类型,则该方法、索引器或构造函数是执行的候选项。

如果找到多个候选项,则会将首选转换的重载决策规则应用于显式指定的实参。 将忽略可选形参已省略的实参。

如果两个候选项不相上下,则会将没有可选形参的候选项作为首选项,对于这些可选形参,已在调用中为其省略了实参。 这是具有较少形参的候选项的重载决策中一般首选项的结果。

Page 25: Framework3.x&4.0 新特性

命名实参和可选实参 Named Arguments\Optional Parameters

扩展话题Framework 中可选参数是如何实现?

解析 :1 、在 C# 中编写代码段 :

结论 :凡是可选参数, CLR 中自动添加了两个特性即OptionalAttribute, DefaultParameterValueAttribute

2 、使用 Reflector 工具反编译查看源代码

Page 26: Framework3.x&4.0 新特性

命名实参和可选实参 Named Arguments\Optional Parameters

Framework 中命名参数是如何实现? 解析 :1 、在 C# 中编写代码段 :

结论 :凡是可选参数, CLR 中默认添加了两个特性即OptionalAttribute, DefaultParameterValueAttribute

怎么使用传统的方式可以实现可选参数?

Page 27: Framework3.x&4.0 新特性

命名实参和可选实参 Named Arguments\Optional Parameters

2 、使用 Reflector 工具反编译查看源代码

结论 :CLR 在运行时,将每一个参数申明了一次,再按被调用方法的参数依次进 行传递。我们传统的写法上并无差异,只是在写代码时,要简化了开发人员的 工作量。

资料http://msdn.microsoft.com/zh-cn/library/dd264739.aspx

Page 28: Framework3.x&4.0 新特性

目录扩展方法

LINQ

Lambda

自动实现属性对象集合初始化器 \ 隐式类型数组匿名类型 \ 匿名方法 \ 匿名委托延迟加载

var&dynamic

命名参数和可选参数

Page 29: Framework3.x&4.0 新特性

var&dynamic var 概述

Framework3.0 引入了 var, 方法范围中声明的变量可以具有隐式类型 var 。 隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。

var应用 例 1: 在数组中查找包括某特定的字符的元素。

Page 30: Framework3.x&4.0 新特性

var&dynamic 例 2: 什么时候必须使用 var 隐式类型 ? 当表达式返回匿名类型的时候必须使用 var 隐式类型,例如 :

dynamic 概述 Framework3.0 引入了 dynamic,凡是被申明 dynamic 的类型,编译器在编译时都不会被检查, 但会在运行时进行检查,若对象或方法不存在,会抛出异常。 dynamic 不能调用扩展方法。

Page 31: Framework3.x&4.0 新特性

var&dynamic

测试 dynamic 调用一个不存的方法。

dynamic应用 简单 dynamic应用。

Page 32: Framework3.x&4.0 新特性

var&dynamic 测试 dynamic 调用一个扩展方法。

dynamic 类型的转换。

dynamic 类型的转换, CLR 在运行时,先计算右边的表达式值,然后赋给右边!

Page 33: Framework3.x&4.0 新特性

var&dynamic

资料http://msdn.microsoft.com/zh-cn/library/bb383973.aspxhttp://msdn.microsoft.com/zh-cn/library/dd264736.aspx

• var 是在编译时,由编译器确定类型它的数据类型, dynamic 是在运行进确定它的数据类型 ;

• var 只能定义局部变量,而 dynamic 没有这个限制。

扩展话题 var 与 dynamic 两者有何区别 ?

Page 34: Framework3.x&4.0 新特性

目录扩展方法

Lambda

自动实现属性对象集合初始化器 \ 隐式类型数组匿名类型 \ 匿名方法 \ 匿名委托延迟加载

LINQ

命名参数和可选参数var&dynamic

Page 35: Framework3.x&4.0 新特性

LINQ 概述

语言集成查询 (LINQ) 是 Framework3.0 新推出的新技术,借助于 LINQ ,查询现在已是高级语言构造,就如同类、方法、事件等等。对于编写查询的开发人员来说, LINQ 最明显的“语言集成”部分是查询表达式。 查询表达式是使用 C# 3.0 中引入的声明性查询语法编写的。 通过使用查询语法,您甚至可以使用最少的代码对数据源执行复杂的筛选、排序和分组操作。您使用相同的基本查询表达式模式来查询和转换 SQL 数据库、 ADO.NET 数据集、 XML 文档和流以及 .NET 集合中的数据。

MSDN 中解释说 : 一般的规则是尽可能使用 (1) ,而在必要时使用 (2) 和 (3)

来自 : http://msdn.microsoft.com/zh-cn/library/bb397678.aspx#Y401 。

LINQ 查询方式 使用查询语法

组合使用查询语法和方法语法。 使用方法语法

Page 36: Framework3.x&4.0 新特性

LINQ应用

使用 where子句筛选

使用 where子句筛选,对结果集排序

使用 where子句筛选,对结果集排序、分组

Page 37: Framework3.x&4.0 新特性

LINQ

使用 let子句 ( 来对子查询起一个别名 )

Page 38: Framework3.x&4.0 新特性

LINQ LINQ 中的聚合函数 (Sum 、 Max 、 Min 、 Average) 的使用

从方法中返回查询

在内存中存储查询结果 (ToList 、 ToArray 、 ToDictionary 、 ToLookup)

在 LINQ 中使用创建嵌套组

Page 39: Framework3.x&4.0 新特性

LINQ

Page 40: Framework3.x&4.0 新特性

LINQ 表联接

http://msdn.microsoft.com/zh-cn/library/bb397941.aspxhttp://msdn.microsoft.com/zh-cn/library/bb397905.aspxhttp://msdn.microsoft.com/zh-cn/library/bb397895.aspxhttp://msdn.microsoft.com/zh-cn/library/bb907099.aspxhttp://msdn.microsoft.com/zh-cn/library/bb882533.aspx

Linq to SQL 添加

最简单的形式 ( 单表 )

Page 41: Framework3.x&4.0 新特性

LINQ 一对多 (父子表 )

多对多

Page 42: Framework3.x&4.0 新特性

LINQ 修改

修改单个表数据

修改多个表数据

删除 删除单个表数据

Page 43: Framework3.x&4.0 新特性

LINQ

删除多个表数据

推理删除

Page 44: Framework3.x&4.0 新特性

LINQ Linq to XML

创建 XML文档

加载 XML文档

Page 45: Framework3.x&4.0 新特性

LINQ 查询

Page 46: Framework3.x&4.0 新特性

LINQ

Page 47: Framework3.x&4.0 新特性

LINQ 资料

http://msdn.microsoft.com/zh-cn/library/bb397676.aspx LINQ 查询表达式 http://msdn.microsoft.com/zh-cn/library/bb384065.aspx 查询表达式基础 http://msdn.microsoft.com/zh-cn/library/bb397678.aspx#Y1134 如何:在 C# 中编写 LINQ 查询 http://msdn.microsoft.com/zh-cn/library/bb907066.aspx 如何:查询对象集合 http://msdn.microsoft.com/zh-cn/library/bb882532.aspx 如何:从方法中返回查询 http://msdn.microsoft.com/zh-cn/library/bb513810.aspx 如何:在内存中存储查询结果 http://msdn.microsoft.com/zh-cn/library/bb545971.aspx 如何:对查询结果进行分组 http://msdn.microsoft.com/zh-cn/library/bb545974.aspx 如何:创建嵌套组 http://msdn.microsoft.com/zh-cn/library/bb311041.aspx 如何:对分组操作执行子查询 http://msdn.microsoft.com/zh-cn/library/cc138361.aspx 如何:按连续键对结果进行分组 http://msdn.microsoft.com/zh-cn/library/bb513731.aspx 如何:在运行时动态指定谓词筛选器 http://msdn.microsoft.com/zh-cn/library/bb397905.aspx 如何:执行内部联接 http://msdn.microsoft.com/zh-cn/library/bb397895.aspx 如何:执行左外部联接 http://msdn.microsoft.com/zh-cn/library/bb882517.aspx 如何:对 Join 子句的结果进行排序 http://msdn.microsoft.com/zh-cn/library/bb907099.aspx 如何:使用复合键进行联接 http://msdn.microsoft.com/zh-cn/library/bb882533.aspx 如何:执行自定义联接操作 http://msdn.microsoft.com/zh-cn/library/bb882535.aspx 如何:在查询表达式中处理 Null 值 http://msdn.microsoft.com/zh-cn/library/bb513730.aspx 如何:在查询表达式中处理异常 http://msdn.microsoft.com/zh-cn/library/bb387083.aspx Linq to XML http://msdn.microsoft.com/zh-cn/library/bb387051.aspx Linq to XML http://msdn.microsoft.com/zh-cn/library/bb675200.aspx Linq to XML http://msdn.microsoft.com/zh-cn/library/bb943914.aspx Linq to XML

MSDN

Page 48: Framework3.x&4.0 新特性

LINQ

其他 http://kb.cnblogs.com/zt/linq/ LINQ专题 http://space.cnblogs.com/group/linq/ Linq小组 http://www.cnblogs.com/sunyanjun/articles/2097187.html LINQ 中使用表联接 http://www.cnblogs.com/sunyanjun/articles/2096145.html LINQ 中实现 NOT IN语句 http://www.cnblogs.com/lyj/category/113393.html 李永京博客 http://www.cnblogs.com/sunyanjun/articles/1865003.html Linq to XML http://www.cnblogs.com/sunyanjun/articles/1859521.html Linq to XML

Page 49: Framework3.x&4.0 新特性

目录扩展方法自动实现属性对象集合初始化器 \ 隐式类型数组匿名类型 \ 匿名方法 \ 匿名委托延迟加载

Lambda

命名参数和可选参数var&dynamic

LINQ

Page 50: Framework3.x&4.0 新特性

Lambda 概述

“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式树类型。

所有 Lambda 表达式都使用 Lambda 运算符 => ,该运算符读为“ goes to” 。 该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。 Lambda 表达式 x => x * x 读作“ x goes to x times x” 。可以将此表达式分配给委托类型。

=> 运算符具有与赋值运算符 (=) 相同的优先级,并且是右结合运算符。在 is或 as 运算符的左侧不允许使用 Lambda 。

Lambda表达式 表达式在右边的 Lambda 表达式称为“ Lambda 表达式”。 Lambda 表达

式在构造表达式树时广泛使用。 Lambda 表达式返回表达式的结果,并采用以下基本形式:(input parameters) => expression

Page 51: Framework3.x&4.0 新特性

Lambda

有时,编译器难于或无法推断输入类型。 如果出现这种情况,您可以按以下示例中所示方式显式指定类型:(int x, string s) => s.Length > x

使用空括号指定零个输入参数 : () => SomeMethod()

只有在 Lambda 有一个输入参数时,括号才是可选的;否则括号是必需的。 两个或更多输入参数由括在括号中的逗号分隔:(x, y) => x == y

Page 52: Framework3.x&4.0 新特性

Lambda Lambda语句

Lambda 语句与 Lambda 表达式类似,只是语句括在大括号中: (input parameters) => {statement;}

Lambda 语句的主体可以包含任意数量的语句;但是,实际上通常不会多于两个或三个语句。delegate void TestDelegate(string s); … TestDelegate myDel = n => { string s = n + " " + "World"; Console.WriteLine(s); }; myDel("Hello");

资料 http://msdn.microsoft.com/zh-cn/library/bb397687.aspx lambda http://kb.cnblogs.com/a/1074206/

Page 53: Framework3.x&4.0 新特性

THANK YOU