530 likes | 664 Views
Framework3.x&4.0 新特性. 信息化技术部 孙严军 2011/08/30. 目录. 扩展方法. 自动实现属性. 对象集合初始化器 隐式类型数组. 匿名类型 匿名方法 匿名委托. 延迟加载. 命名实参和可选实参. var&dynamic 的方法. LINQ. Lambda. 扩展方法 Extension Methods. 概述.
E N D
Framework3.x&4.0新特性 信息化技术部 孙严军 2011/08/30
目录 扩展方法 自动实现属性 • 对象集合初始化器\隐式类型数组 • 匿名类型\匿名方法\匿名委托 延迟加载 命名实参和可选实参 var&dynamic的方法 • LINQ • Lambda
扩展方法Extension Methods • 概述 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。 • 申明
扩展方法Extension Methods • 调用 • 约束 • 如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。 • 扩展方法必须定义在非泛型的静态类中。 • 扩展方法必须申明为静态的。 • 要扩展的类型前必须冠以this关键字。 • 扩展话题 • 如果某个类型使用了扩展方法,使用反射可以获取该扩展方法吗?
扩展方法Extension Methods • 资料 • http://msdn.microsoft.com/zh-cn/library/bb383977.aspx(MSDN) • http://www.cnblogs.com/ldp615/category/260324.html鹤冲天博客 • 《C#本质论》第四版
目录 扩展方法 自动实现属性 • 对象集合初始化器\隐式类型数组 匿名类型\匿名方法\匿名委托 延迟加载 命名实参和可选实参 Var&dynamic的方法 • LINQ • Lambda
自动实现属性Auto-implemented properties • 概述 当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁。 客户端代码还可通过这些属性创建对象。 在运行时编译器将创建一个私有的匿名支持字段,该字段只能通过属性的 get 和 set 访问器进行访问。 • 申明 • 扩展话题 • 自动实现属性Framework中是如何实现的呢?
自动实现属性Auto-implemented properties • 资料 • http://msdn.microsoft.com/zh-cn/library/bb384054.aspx (MSDN) • 《C#本质论》第四版
目录 扩展方法 自动实现属性 • 对象集合初始化器\隐式类型数组 匿名类型 延时加载 • 命名实参和可选实参 var&dynamic • LINQ • Lambda
对象集合初始化器\隐式类型数组 Initializer • 概述 对象集合初始化器 (Object and Collection Initializers)使用对象初始值设定项可以在创建对象时向对象的任何可访问的字段或属性分配值,而无需显式调用构造函数。 • 对象初始化器 Object Initializer • 集合初始化器 CollectionInitializer
对象集合初始化器\隐式类型数组 Initializer • 隐式类型数组 Array Initializer • 扩展话题 • 为什么可以使用new [Object]{Property=Value}的方式可以初始化对象\集合\数组呢? • 解析:1、在C#中编写代码段:
对象集合初始化器\隐式类型数组 Initializer • 2、使用Reflector工具反编译查看源代码 • 3、结论 • 资料 • http://msdn.microsoft.com/zh-cn/library/bb384062.aspx (MSDN) • 《C#本质论》第四版
目录 扩展方法 自动实现属性 • 对象集合初始化器\隐式类型数组 匿名类型\匿名方法\匿名委托 延迟加载 命名实参和可选实参 var&dynamic的方法 • LINQ • Lambda
匿名类型\匿名方法\匿名委托 Anonymous • 匿名类型 Anonymous Type 匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 这些属性的类型由编译器推断。匿名类型是直接从对象派生的引用类型,唯一区别在于匿名类型无法强制转换为除object以外的任何类型。 如果两个或更多个匿名类型以相同的顺序具有相同数量和种类的属性,则编译 器会将这些匿名类型视为相同的类型,并且它们共享编译器生成的相同类型信息。 匿名类型具有方法范围。
匿名类型\匿名方法\匿名委托 Anonymous • 资料 • http://msdn.microsoft.com/zh-cn/library/bb397696.aspx (MSDN)
匿名类型\匿名方法\匿名委托 Anonymous 在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。Framework 2.0 引入了匿名方法。要将代码块传递为委托参数,创建匿名方法则是唯一的方法。 • 匿名方法\匿名委托Anonymous Mmethod\Delegate • 资料 • http://msdn.microsoft.com/zh-cn/library/0yw3tz5k(v=vs.80).aspx (MSDN)
目录 扩展方法 自动实现属性 • 对象集合初始化器\隐式类型数组 匿名类型\匿名方法\匿名委托 延迟加载 命名实参和可选实参 var&dynamic的方法 • LINQ • Lambda
延迟加载 LazyLoad • 概述 延迟加载就是推迟初例化对象。Fx4.0中提供了Lazy<T>类来实现延迟加载,主在要ORM中使用的比较广泛,并非.Net Framework所独有的,在JAVA语言或很多框架中都有用到如IBatis.NET、Hibernate、NHibernate、Linq to SQL等。 • 应用
延迟加载 LazyLoad • 扩展话题 • 使用fx1.0或2.0的方式如何实现延迟加载?
延迟加载 LazyLoad • 资料 • http://msdn.microsoft.com/zh-cn/library/bb399393.aspx延迟加载与立即加载 • http://www.cnblogs.com/kym/archive/2010/02/21/1670226.html
目录 扩展方法 自动实现属性 • 对象集合初始化器\隐式类型数组 匿名类型\匿名方法\匿名委托 延迟加载 命名参数和可选参数 var&dynamic的方法 • LINQ • Lambda
命名实参和可选实参 Named Arguments\Optional Parameters • 概述 • Framework4.0引入了命名实参和可选实参。命名参数在调用函数时可以通过指定参数名称的方式来调用参数。它最大的好处就是方便调用参数时按调用者的需要来排列顺序而不必死守函数声明时的顺序,同时结合默认参数值的特性,可以选择使用默认参数还是不使用默认参数。可选参数,CLR在运行时,自动增加了相关的特性来告诉被调用的方法传什么样的参数,会调用什么样的方法(将在本章节的扩展话题是详解)。 • 命名参数
命名实参和可选实参 Named Arguments\Optional Parameters • 可选参数 • 示例.
命名实参和可选实参 Named Arguments\Optional Parameters • 可选参数方法的重载. • 可选参数重载策略(摘自CSDN) http://msdn.microsoft.com/zh-cn/library/dd264739.aspx • 使用命名实参和可选实参将在以下方面对重载决策产生影响: • 如果方法、索引器或构造函数的各个形参均为可选,或者按名称或位置与调用语句中的单个实参对应,并且该实参可转换为形参的类型,则该方法、索引器或构造函数是执行的候选项。 • 如果找到多个候选项,则会将首选转换的重载决策规则应用于显式指定的实参。 将忽略可选形参已省略的实参。 • 如果两个候选项不相上下,则会将没有可选形参的候选项作为首选项,对于这些可选形参,已在调用中为其省略了实参。 这是具有较少形参的候选项的重载决策中一般首选项的结果。
命名实参和可选实参 Named Arguments\Optional Parameters • 扩展话题 • Framework中可选参数是如何实现? • 解析:1、在C#中编写代码段: • 2、使用Reflector工具反编译查看源代码 结论:凡是可选参数,CLR中自动添加了两个特性即OptionalAttribute, DefaultParameterValueAttribute
命名实参和可选实参 Named Arguments\Optional Parameters • 怎么使用传统的方式可以实现可选参数? • Framework中命名参数是如何实现? • 解析:1、在C#中编写代码段: 结论:凡是可选参数,CLR中默认添加了两个特性即OptionalAttribute, DefaultParameterValueAttribute
命名实参和可选实参 Named Arguments\Optional Parameters • 2、使用Reflector工具反编译查看源代码 • 结论:CLR在运行时,将每一个参数申明了一次,再按被调用方法的参数依次进行传递。我们传统的写法上并无差异,只是在写代码时,要简化了开发人员的工作量。 • 资料 • http://msdn.microsoft.com/zh-cn/library/dd264739.aspx
目录 扩展方法 自动实现属性 • 对象集合初始化器\隐式类型数组 匿名类型\匿名方法\匿名委托 延迟加载 命名参数和可选参数 var&dynamic • LINQ • Lambda
var&dynamic • var概述 • Framework3.0引入了var,方法范围中声明的变量可以具有隐式类型 var。 隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。 • var应用 • 例1:在数组中查找包括某特定的字符的元素。
var&dynamic • 例2:什么时候必须使用var隐式类型? • 当表达式返回匿名类型的时候必须使用var隐式类型,例如: • dynamic概述 • Framework3.0引入了dynamic,凡是被申明dynamic的类型,编译器在编译时都不会被检查,但会在运行时进行检查,若对象或方法不存在,会抛出异常。dynamic不能调用扩展方法。
var&dynamic • dynamic应用 • 简单dynamic应用。 • 测试dynamic调用一个不存的方法。
var&dynamic • 测试dynamic调用一个扩展方法。 • dynamic类型的转换。 dynamic类型的转换,CLR在运行时,先计算右边的表达式值,然后赋给右边!
var&dynamic • 扩展话题 • var与dynamic两者有何区别? • var是在编译时,由编译器确定类型它的数据类型,dynamic是在运行进确定它的数据类型; • var只能定义局部变量,而dynamic没有这个限制。 • 资料 • http://msdn.microsoft.com/zh-cn/library/bb383973.aspx • http://msdn.microsoft.com/zh-cn/library/dd264736.aspx
目录 扩展方法 自动实现属性 • 对象集合初始化器\隐式类型数组 匿名类型\匿名方法\匿名委托 延迟加载 命名参数和可选参数 var&dynamic • LINQ • Lambda
LINQ • 概述 • 语言集成查询 (LINQ) 是Framework3.0新推出的新技术,借助于 LINQ,查询现在已是高级语言构造,就如同类、方法、事件等等。对于编写查询的开发人员来说,LINQ 最明显的“语言集成”部分是查询表达式。 查询表达式是使用 C# 3.0 中引入的声明性查询语法编写的。 通过使用查询语法,您甚至可以使用最少的代码对数据源执行复杂的筛选、排序和分组操作。您使用相同的基本查询表达式模式来查询和转换 SQL 数据库、ADO.NET 数据集、XML 文档和流以及 .NET 集合中的数据。 • LINQ 查询方式 • 使用查询语法 • 使用方法语法 • 组合使用查询语法和方法语法。 • MSDN中解释说:一般的规则是尽可能使用 (1),而在必要时使用 (2) 和 (3)来自: http://msdn.microsoft.com/zh-cn/library/bb397678.aspx#Y401。
LINQ • 应用 • 使用where子句筛选 • 使用where子句筛选,对结果集排序 • 使用where子句筛选,对结果集排序、分组
LINQ • 使用let子句(来对子查询起一个别名)
LINQ • LINQ中的聚合函数(Sum、Max、Min、Average)的使用 • 从方法中返回查询 • 在内存中存储查询结果(ToList、ToArray、ToDictionary、ToLookup) • 在LINQ中使用创建嵌套组
LINQ • 表联接 http://msdn.microsoft.com/zh-cn/library/bb397941.aspxhttp://msdn.microsoft.com/zh-cn/library/bb397905.aspx http://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 • 添加 • 最简单的形式(单表)
LINQ • 一对多(父子表) • 多对多
LINQ • 修改 • 修改单个表数据 • 修改多个表数据 • 删除 • 删除单个表数据
LINQ • 删除多个表数据 • 推理删除
LINQ • Linq to XML • 创建XML文档 • 加载XML文档
LINQ • 查询
LINQ • 资料 • MSDN • http://msdn.microsoft.com/zh-cn/library/bb397676.aspxLINQ 查询表达式 • 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.aspxLinq to XML • http://msdn.microsoft.com/zh-cn/library/bb387051.aspxLinq to XML • http://msdn.microsoft.com/zh-cn/library/bb675200.aspxLinq to XML • http://msdn.microsoft.com/zh-cn/library/bb943914.aspxLinq to XML
LINQ • 其他 • http://kb.cnblogs.com/zt/linq/ LINQ专题 • http://space.cnblogs.com/group/linq/ Linq小组 • http://www.cnblogs.com/sunyanjun/articles/2097187.htmlLINQ中使用表联接 • 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.htmlLinq to XML • http://www.cnblogs.com/sunyanjun/articles/1859521.htmlLinq to XML
目录 扩展方法 自动实现属性 • 对象集合初始化器\隐式类型数组 匿名类型\匿名方法\匿名委托 延迟加载 命名参数和可选参数 var&dynamic LINQ Lambda
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