快速入门系列--深入理解C#
C#语言在近些年得到了长足的方法,代码风格越来越简洁美观,例如常用的泛型及其约束、可空类型、隐式类型、匿名类型和委托等,通过下面的表格可以对这部分相对简单的特性的使用有一个初步的了解。
|
特性 |
示例 |
|
泛型及其约束 |
class Sample<T> where T : Stream |
|
可空类型 |
Nullable<int>,int?, 注意这个可空类型为一个结构体而不是类 |
|
隐式类型 |
var i = 0; |
|
匿名类型 |
var xionger = new {Name="xionger", age=27} |
|
简化的迭代器 |
For(var i=0; i < 3; i++) { yield return i;} |
|
委托 |
Action<T>, Func<T, TResult>,在使用委托时需要注意闭包的概念(和javascript中的类似),理解闭包对象的生命周期 |
|
扩展方法 |
public static bool IsNull(this String x){} |
|
动态类型 |
Dynamic expando = new ExpandoObject();在做一些模板方法和复用代码时非常有用。 |
|
分部类 |
partial class, 使用场景:扩展代码生成工具的类;某些服务类过大,对其进行逻辑拆分,便于维护 |
|
lambda表达式和表达式树 |
returnLength = text => text.length;而表达式树是一个类似语法树的树形结构。 Expression firstArg = Expression.Constant(2); Expression secondArg = Expression.Constant(3); Expression add = Expression.Add(firstArg, secondArg); |
由于这部分的特性理解和使用相对容易就不详细介绍了,而之后的表达式树、linq和异步模型相对复杂,将进行详细介绍。

Linq可以通过一个中间模型将两种存在差异的数据模型通过统一的方式调用,非常的方便,接下来通过一个简单表格描述Linq的常见操作,在实际中,个人还是比较推荐扩展方法的方式。
|
操作和扩展 |
示例 |
|
选择元素 |
var query = from user in SampleData.AllUsers select user; |
|
过滤和排序 |
var query = from defect in SampleData.AllDefects where defect.Status != Status.Closed where defect.AssignedTo = tim orderby defect.Severity descending select defect.Summary; |
|
Let字句 |
引入局部变量 var query = from user in SampleData.AllUsers let length = user.Name.length orderby length select new {Name = user.Name, Length = length} |
|
连接 |
介绍一个相对复杂的分组连接。 var query = from defect in SampleData.AllDefects join subscription in SampleData.AllSubscriptions on defect.Project equals subscription.Project into groupedSubscriptions select new {Defect = defect, Subscription = groupedSubscriptions } |
|
分组 |
var query = from defect in SampleData.AllDefects group defect by defect.AssignedTo |
此外,Linq对SQL、XML和对象集合都提供了非常简便的API方法,可以查看相关博客http://www.cnblogs.com/luckdv/articles/1728088.html。

这个给予TPL的C#5特性非常的有意思,可以将异步操作的调用转化为同步的形式,非常的便捷,一个非常简单的例子如下所示。
async void DisplayWebsiteLength(object sender, EventArgs e)
{
Label.Text = "Fetching...";
using(HttpClient client = new HttpClient()){
Task<string> task = client.GetStringAsync("www.bjork.com");
String text = await task;
Label.Text = text.Length.ToString();
}}
tip:
PadLeft由于在字符串左侧补零。
参考资料
- (英)Jon, Skeet. 《深入理解C#(第3版)》[M]. 北京:人民邮电出版社, 2014.
快速入门系列--深入理解C#的更多相关文章
- 快速入门系列--WebAPI--01基础
ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...
- 快速入门系列--MVC--01概述
虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...
- 快速入门系列--MVC--02路由
现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...
- WPF快速入门系列(4)——深入解析WPF绑定
一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...
- WPF快速入门系列(1)——WPF布局概览
一.引言 关于WPF早在一年前就已经看过<深入浅出WPF>这本书,当时看完之后由于没有做笔记,以至于我现在又重新捡起来并记录下学习的过程,本系列将是一个WPF快速入门系列,主要介绍WPF中 ...
- [转]快速入门系列--WebAPI--01基础
本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...
- 前端学习 node 快速入门 系列 —— 简易版 Apache
其他章节请看: 前端学习 node 快速入门 系列 简易版 Apache 我们用 node 来实现一个简易版的 Apache:提供静态资源访问的能力. 实现 直接上代码. - demo - stati ...
- vue 快速入门 系列 —— 虚拟 DOM
其他章节请看: vue 快速入门 系列 虚拟 DOM 什么是虚拟 dom dom 是文档对象模型,以节点树的形式来表现文档. 虚拟 dom 不是真正意义上的 dom.而是一个 javascript 对 ...
- vue 快速入门 系列 —— 侦测数据的变化 - [基本实现]
其他章节请看: vue 快速入门 系列 侦测数据的变化 - [基本实现] 在 初步认识 vue 这篇文章的 hello-world 示例中,我们通过修改数据(app.seen = false),页面中 ...
随机推荐
- Java/Android 二进制数据与String互转
将经过加密的二进制数据保存到本地的方法 byte[] src = new byte[] { 122,-69, -17, 92, -76, 52, -21, -87, -10, 105, 76, -75 ...
- C#is运算符的作用
is运算符的含义:检查对象是不是给定类型,或者是否可以转换为给定类型,如果是,这个运算符就返回True. is运算符的语法:<operand> is <type> 这个表达式的 ...
- 详细!交叉编译时 note: the mangling of 'va_list' has changed in GCC 4.4解决办法
为什么要在标题前面加了详细两个字,就是为了吸引看文章的你还有写文章的我这种小白,我是从坑里面爬出来了. 废话少说.... 问题就是这样子了,至于解决办法,在网上搜索了很久,大多数以一段英文作为解决办法 ...
- idea小技巧
1.不使用import *:Setting=>Editor=>Code Style=>Java=>Imports=>Class count to use/Names co ...
- mysql 索引问题
转自http://www.blogjava.net/happyenjoylife/archive/2011/12/17/366639.html mysql innodb存储与索引的总结 Innodb存 ...
- [收集]在iPhone桌面的应用程序图标右上角显示数字
能够在ios桌面的程序icon右上角显示数字(badge number)的方法 在ViewController中的viewDidLoad方法中添加如下代码即可 - (void)viewDidLoad ...
- GNU Makefile编写
[Introduction] make 是程序员很好用的工具,如果存在makefile存在,每次更新代码,执行shell命令 shell 就可以执行所有需要编译的文件,make是根据你编写的Makef ...
- 对InvokeAction简略分析了解验证失败为什么Action还会继续执行
一.前言 有些同学使用AuthorizationFilter来进行用户是否登录验证,如果未登录就跳到登录页. 很简单的一个场景,但是有些同学会发现虽然验证失败了,但是整个Action还会执行一遍. 于 ...
- 细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一
细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一(转) ADO.NET Entity Framework ADO.NET Entity Framework 是微软以 ADO.N ...
- 我的ORM之五-- 事务
我的ORM索引 单库事务与分布式事务 单库事务: 性能更好,应用于一个数据库时的场景,当数据库发生变化,如拆分为多个服务器,代码需要修改. 分布式事务:性能相对较差,但有更大的适用场景.当数据库发生变 ...