连载目录    [已更新最新开发文章,点击查看详细] 本篇将介绍如何访问表达式树中的每个节点,同时生成该表达式树的已修改副本. 以下是在两个重要方案中将使用的技巧. 第一种是了解表达式树表示的算法,以便可以将其转换到另一个环境中. 第二种是何时更改已创建的算法. 这可能是为了添加日志记录.拦截方法调用并跟踪它们,或其他目的. 转换即访问 生成的用于转换表达式树的代码是你已看到的用于访问树中所有节点的代码的扩展. 转换表达式树时,会访问所有节点,并在访问它们的同时生成新树. 新树可包含对原始节点的…
连载目录    [已更新最新开发文章,点击查看详细] 如果你使用过 LINQ,则会有丰富库(其中 Func 类型是 API 集的一部分)的经验. (如果尚不熟悉 LINQ,建议阅读 LINQ 教程,以及本文前面有关 lambda 表达式的文章.)表达式树提供与作为函数的参数的更丰富的交互. 在创建 LINQ 查询时,通常使用 Lambda 表达式编写函数参数. 在典型的 LINQ 查询中,这些函数参数会被转换为编译器创建的委托. 当想要进行更丰富的交互时,需要使用表达式树. 表达式树将代码表示为…
连载目录    [已更新最新开发文章,点击查看详细] 到目前为止,你所看到的所有表达式树都是由 C# 编译器创建的. 你所要做的是创建一个 lambda 表达式,将其分配给一个类型为 Expression<Func<T>> 或某种相似类型的变量. 这不是创建表达式树的唯一方法. 很多情况下,可能需要在运行时在内存中生成一个表达式. 由于这些表达式树是不可变的,所以生成表达式树很复杂. 不可变意味着必须以从叶到根的方式生成表达式树. 用于生成表达式树的 API 体现了这一点:用于生成…
连载目录    [已更新最新开发文章,点击查看详细] 表达式树中的每个节点将是派生自 Expression 的类的对象. 该设计使得访问表达式树中的所有节点成为相对直接的递归操作. 常规策略是从根节点开始并确定它是哪种节点. 如果节点类型具有子级,则以递归方式访问该子级. 在每个子节点中,重复在根节点处使用的步骤:确定类型,且如果该类型具有子级,则访问每个子级. 检查不具有子级的表达式 让我们首先访问一个非常简单的表达式树中的每个节点. 下面是创建常数表达式然后检查其属性的代码: , typeo…
连载目录    [已更新最新开发文章,点击查看详细] 表达式树是定义代码的数据结构. 它们基于编译器用于分析代码和生成已编译输出的相同结构.表达式树和 Roslyn API 中用于生成分析器和 CodeFixes 的类型之间存在很多相似之处. (分析器和 CodeFixes 是 NuGet 包,用于对代码执行静态分析,并可为开发人员建议可能的修补程序.)两者概念相似,且最终结果是一种数据结构,该结构允许以有意义的方式对源代码进行检查. 但是,表达式树基于一组与 Roslyn API 完全不同的类…
连载目录    [已更新最新开发文章,点击查看详细] 存在可与表达式树配合使用的 .NET Core framework 中的类的大型列表. 可以在 System.Linq.Expressions 查看完整列表. 让我们来了解一下 framework 类的设计方式,而不是逐一查看完整列表. 在语言设计中,表达式是可计算并返回值的代码主体. 表达式可能非常简单:常数表达式 1 返回常数值 1. 它们可能更复杂:表达式 (-B + Math.Sqrt(B*B - 4 * A * C)) / (2 *…
连载目录    [已更新最新开发文章,点击查看详细] 表达式树 是表示一些代码的数据结构. 它不是已编译且可执行的代码. 如果想要执行由表达式树表示的 .NET 代码,则必须将其转换为可执行的 IL 指令. Lambda 表达式到函数 可以将任何 LambdaExpression 或派生自 LambdaExpression 的任何类型转换为可执行的 IL. 其他表达式类型不能直接转换为代码. 此限制在实践中影响不大. Lambda 表达式是你可通过转换为可执行的中间语言 (IL) 来执行的唯一表…
连载目录    [已更新最新开发文章,点击查看详细] 介绍性的语言集成查询 (LINQ) 文档中的大多数查询是使用 LINQ 声明性查询语法编写的.但是在编译代码时,查询语法必须转换为针对 .NET 公共语言运行时 (CLR) 的方法调用. 这些方法调用会调用标准查询运算符(名称为 Where.Select.GroupBy.Join.Max 和 Average 等). 可以使用方法语法(而不查询语法)来直接调用它们. 查询语法和方法语法在语义上是相同的,但是许多人发现查询语法更简单且更易于阅读.…
连载目录    [已更新最新开发文章,点击查看详细] Lambda 表达式是作为对象处理的代码块(表达式或语句块). 它可作为参数传递给方法,也可通过方法调用返回. Lambda 表达式广泛用于: 将要执行的代码传递给异步方法,例如 Task.Run(Action). 编写 LINQ 查询表达式. 创建表达式树. Lambda 表达式是可以表示为委托的代码,或者表示为表达式树的代码,它所表示的表达式树可以编译为委托. Lambda 表达式的特定委托类型取决于其参数和返回值. 不返回值的 Lamb…
C#基础拾遗系列之二:使用ILSpy探索C#7.0新增功能点   第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它包括封装.继承和多态性.C#面向对象的行为包括: 统一的类型系统 类与接口 属性.方法.事件 (2)类型安全:C#还允许通过dynamic关键字动态指定类型. 但是,C#仍然是一个主要的静态类型语言.之所以是一种强类型的语言,是因为它的类型规则是非常严格的,例如,不能够使用一个float类型的参数去…
连载目录    [已更新最新开发文章,点击查看详细] 在 C# 中,协变和逆变能够实现数组类型.委托类型和泛型类型参数的隐式引用转换. 协变保留分配兼容性,逆变则与之相反. 以下代码演示分配兼容性.协变和逆变之间的差异. // 分配兼容性. string str = "test"; // 将派生类型更高的对象分配给派生类型更低的对象 object obj = str; IEnumerable<string> strings = new List<string>(…
C#动态构建表达式树(三)--表达式的组合 前言 在筛选数据的过程中,可能会有这样的情况:有一些查询条件是公共的,但是根据具体的传入参数可能需要再额外增加一个条件.对于这种问题一般有两种方法: a. 在 Where 后再组合一个 Where,如: List<SOME_CLASS> dataList = dataList.Where(FILTER_1).Where(FILTER_2).ToList(); b. 将类型相同两个表达式组合起来(就是本文的主题了) 由于项目中既有框架的封装,查询时只能…
连载目录    [已更新最新开发文章,点击查看详细] 查询是什么及其作用是什么 查询是一组指令,描述要从给定数据源(或源)检索的数据以及返回的数据应具有的形状和组织. 查询与它生成的结果不同. 通常情况下,源数据按逻辑方式组织为相同类型的元素的序列. 例如,SQL 数据库表包含行的序列. 在 XML 文件中,存在 XML 元素的“序列”(尽管这些元素在树结构按层次结构进行组织). 内存中集合包含对象的序列. 从应用程序的角度来看,原始源数据的特定类型和结构并不重要. 应用程序始终将源数据视为 I…
第一部分: C#是一种通用的,类型安全的,面向对象的编程语言.有如下特点: (1)面向对象:c# 是面向对象的范例的一个丰富实现, 它包括封装.继承和多态性.C#面向对象的行为包括: 统一的类型系统 类与接口 属性.方法.事件 (2)类型安全:C#还允许通过dynamic关键字动态指定类型. 但是,C#仍然是一个主要的静态类型语言.之所以是一种强类型的语言,是因为它的类型规则是非常严格的,例如,不能够使用一个float类型的参数去调用一个解释int 类型的函数,除非显式的把float转换为int…
原文地址:  https://www.cnblogs.com/runningsmallguo/p/8972678.html 第二部分:C#7.0新增的功能 (1)数字字面量的提升: C#7中的数字文字可以包含下划线以提高可读性,这些被称为数字分隔符,并被编译器忽略. 代码如下: 运行结果: 注意:二进制文字可以用0b前缀指定. 所以见到这种写法你不要惊讶,只是为了提高可读性. (2)Out variables and discards(接收out变量和丢弃out变量) 代码: 以前我们的写法:…
连载目录    [已更新最新开发文章,点击查看详细] 标准查询运算符 是组成 LINQ 模式的方法. 这些方法中的大多数都作用于序列:其中序列指其类型实现 IEnumerable<T> 接口或 IQueryable<T> 接口的对象. 标准查询运算符提供包括筛选.投影.聚合.排序等在内的查询功能. 共有两组 LINQ 标准查询运算符,一组作用于类型 IEnumerable<T> 的对象,另一组作用于类型 IQueryable<T> 的对象. 构成每个集合的方…
连载目录    [已更新最新开发文章,点击查看详细] 分部类型 拆分一个类.一个结构.一个接口或一个方法的定义到两个或更多的文件中, 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.   分部类 在以下几种情况下需要拆分类定义: 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理. 当使用自动生成的源文件时,你可以添加代码而不需要重新创建源文件. Visual Studio 在创建Windows 窗体.Web 服务包装器代码等时会使用这种方法…
前言 在<C# 8.0 中使用 Index 和 Range>这篇中有人提出^0是什么意思?处于好奇就去试了,结果抛出异常.查看官方文档说^0索引与 sequence[sequence.Length] 相同,表达式 sequence[^0] 不会引发异常,就像 sequence[sequence.Length] 一样.但是在实际使用[^0]的时候抛出IndexOutOfRangeException的异常,很疑惑究竟是什么原因? 先说一下 C# 8.0 新增的两个新类型和两个新运算符,允许构造Sy…
连载目录    [已更新最新开发文章,点击查看详细] C#8.0提供了许多增强功能 01 Readonly 成员 可将 readonly 修饰符应用于结构的任何成员. 它指示该成员不会修改状态. 这比将 readonly 修饰符应用于 struct 声明更精细. 请考虑以下可变结构: public struct Point { public double X { get; set; } public double Y { get; set; } public double Distance =>…
连载目录    [已更新最新开发文章,点击查看详细] 从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式“类型”var. 隐式类型本地变量为强类型,就像用户已经自行声明该类型,但编译器决定类型一样. i 的以下两个声明在功能上是等效的: ; // 隐式类型 ; // 显式类型 下面的示例演示两个查询表达式. 在第一个表达式中,var 的使用是允许的,但不是必需的,因为查询结果的类型可以明确表述为 IEnumerable<string>. 不过,在第二个表达式中,var 允…
连载目录    [已更新最新开发文章,点击查看详细] 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称. 数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持. 此外,需要针对每种类型的数据源了解不同的查询语言:SQL 数据库.XML 文档.各种 Web 服务等. 借助 LINQ,查询成为了最高级的语言构造,就像类.方法和事件一样. 可以使用语言关键字和熟悉的运算符针对强类型化对象集合编写查询. LINQ 系列技术提供了针对对象 (…
连载目录    [已更新最新开发文章,点击查看详细] 查询表达式 查询表达式使用类似于 SQL 或 XQuery 的声明性语法来查询 IEnumerable 集合. 在编译时,查询语法转换为对 LINQ 提供程序的标准查询运算符扩展方法实现的方法调用. 应用程序通过使用 using 指令指定适当的命名空间来控制范围内的标准查询运算符. 下面的查询表达式获取一个字符串数组,按字符串中的第一个字符对字符串进行分组,然后对各组进行排序. var query = from str in stringAr…
连载目录    [已更新最新开发文章,点击查看详细] 某些使用更频繁的标准查询运算符具有专用的 C# 语言关键字语法,使用这些语法可以在查询表达式中调用这些运算符. 查询表达式是比基于方法的等效项更具可读性的另一种查询表示形式. 查询表达式子句在编译时被转换为对查询方法的调用. 查询表达式语法表 下表列出包含等效查询表达式子句的标准查询运算符. 方法 C# 查询表达式语法  Cast 使用显式类型化范围变量,例如:from int i in  numbers (有关详细信息,请参阅 from 子…
连载目录    [已更新最新开发文章,点击查看详细] C# 7.0 向 C# 语言添加了许多新功能 01 out 变量 支持 out 参数的现有语法已在此版本中得到改进. 现在可以在方法调用的参数列表中声明 out 变量,而不是编写单独的声明语句: if (int.TryParse(input, out int result)) Console.WriteLine(result); else Console.WriteLine("Could not parse input"); 为清晰…
连载目录    [已更新最新开发文章,点击查看详细] C# 6.0 版本包含许多可提高开发人员工作效率的功能. 这些功能的总体效果是让你编写的代码更简洁.更具可读性. 该语法不像许多常见做法那样繁琐. 可以更轻松地看出设计意图. 好好了解这些功能可以帮助你提高生产力,编写更具可读性的代码. 你可以更专注于功能,而不是语言的构造. 本文的其余部分是对每个功能的概述,并提供用于探索每个功能的链接. 还可以在教程部分的 C# 6 交互式探索中探索这些功能. 01 只读自动属性 只读自动属性提供了更简洁…
连载目录    [已更新最新开发文章,点击查看详细] C# 4 介绍命名实参和可选实参. 通过命名实参,你可以为特定形参指定实参,方法是将实参与该形参的名称关联,而不是与形参在形参列表中的位置关联. 通过可选参数,你可以为某些形参省略实参. 这两种技术都可与方法.索引器.构造函数和委托一起使用. 使用命名参数和可选参数时,将按实参出现在实参列表(而不是形参列表)中的顺序计算这些实参. 命名形参和可选形参一起使用时,你可以只为可选形参列表中的少数形参提供实参. 此功能极大地方便了对 COM 接口(…
Xcode是用于为Apple TV,Apple Watch,iPad,iPhone和Mac创建应用程序的完整开发人员工具集.Xcode开发环境采用tvOS SDK,watchOS SDK,iOS SDK和macOS SDK的形式捆绑Instruments分析工具,Simulator和OS框架. Xcode 9的亮点 Xcode 9包括整体质量改进以及广泛的新功能. 全新编辑.快速,基于结构的编辑器,可让您智能地突出显示和浏览代码.包括伟大的Markdown支持. 重构.重构内置于编辑体验之中,并…
Android 7.0 Nougat 为用户和开发者引入多种新功能.本文重点介绍面向开发者的新功能. 请务必查阅 Android 7.0 行为变更以了解平台变更可能影响您的应用的领域. 要详细了解 Android 7.0 的消费者功能,请访问 www.android.com. 多窗口支持 在 Android 7.0 中,我们为该平台引入了一个新的而且非常需要的多任务处理功能 — 多窗口支持. 现在,用户可以一次在屏幕上打开两个应用. 在运行 Android 7.0 的手机和平板电脑上,用户可以并…
C# 6.0 版本包含许多可提高开发人员工作效率的功能. 此版本中的功能包括: 只读自动属性: 可以创建只能在构造函数中设置的只读自动属性. 自动属性初始值设定项: 可以编写初始化表达式来设置自动属性的初始值. Expression-bodied 函数成员: 可以使用 lambda 表达式创建单行方法. using static: 可以将单个类的所有方法导入当前命名空间. Null - 条件运算符: 可以简洁.安全地访问对象的成员,同时仍能使用 null 条件运算符检查 null. 字符串内插:…
连载目录    [已更新最新开发文章,点击查看详细] C# 4 引入了一个新类型 dynamic. 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查. 大多数情况下,该对象就像具有类型 object 一样. 在编译时,将假定类型化为 dynamic 的元素支持任何操作. 因此,不必考虑对象是从 COM API.从动态语言(例如 IronPython).从 HTML 文档对象模型 (DOM).从反射还是从程序中的其他位置获取自己的值. 但是,如果代码无效,则在运行时会捕获到…