快速入门系列--深入理解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),页面中 ...
随机推荐
- [UCSD白板题] Binary Search
Problem Introduction In this problem, you will implemented the binary search algorithm that allows s ...
- tail queue代码阅读
tail queue是bdb中用的最多的数据结构. 定义在 src/dbinc/queue.h: 注: TRACEBUF,QMD_TRACE_HEAD等是为了 queue代码的debug, 这里移除出 ...
- weui 问题
1.阻止checkbox 被 checked 方法1: $('.weui-check').on('click', function(e){ $(this).attr('disabled', true) ...
- Vue.js多重组件嵌套
Vue.js多重组件嵌套 Vue.js中提供了非常棒的组件化思想,组件提高了代码的复用性.今天我们来实现一个形如 <app> <app-header></app-head ...
- 5.webService拦截器
CXF为什么要设计拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. 拦截器分类 1.按所处的位置分:服务器端拦截器,客户端拦截器 2.按消息的方向分:入 ...
- poj 3067 - Japan(树状数组)
先按第一个数从大到小排序,相等的情况下,第二个数按照从大到小排序..... 预处理后,照着树状数组写就行了... 注意:k的最大值应取1000*1000 代码如下: include <cstdi ...
- KMP 算法
KMP 是一个字符串匹配算法.之所以称之为KMP 是因为这个算法是由Knuth.Morris.Pratt三个提出来的. 这个算法能干什么呢 ? 我想到的有三个: 1. 告诉你一个串是否是另外一个串的子 ...
- VS2008 Pocket PC 2003 SE仿真程序上网设置
设置大体分为3个步骤:Microsoft ActiveSync安装配置.Pocket PC 2003 SE仿真程序配置.Pocket PC 2003连接到Microsoft ActiveSync. 1 ...
- nginx+winsw windows服务
1.下载Nginx:http://nginx.org/en/download.html 2.下载winsw配置包:http://files.cnblogs.com/files/objecttozero ...
- Jexus V5.8.2 正式发布,强劲的高性能 web 服务器
Jexus 是一款运行于 Linux 平台,以支持 ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布. 有如下更新: 1,新增 ...