快速入门系列--深入理解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特性非常的有意思,可以将异步操作的调用转化为同步的形式,非常的便捷,一个非常简单的例子如下所示。

 1 async void DisplayWebsiteLength(object sender, EventArgs e)
 2 
 3 {
 4 
 5 Label.Text = "Fetching...";
 6 
 7 using(HttpClient client = new HttpClient()){
 8 
 9 Task<string> task = client.GetStringAsync("www.bjork.com");
10 
11 String text = await task;
12 
13 Label.Text = text.Length.ToString();
14 
15 }}

tip:

PadLeft由于在字符串左侧补零。

参考资料

  1. (英)Jon, Skeet. 《深入理解C#(第3版)》[M]. 北京:人民邮电出版社, 2014.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术点滴

编译器构造

编译器构造 一、 编译器简介 前面谈到静态链接器构造的基本流程,最后提到所构造的链接器若要能正常工作的前提是需要构造一个能生成符合链接器输入文件格式的编译器,本...

2538
来自专栏生信宝典

Python学习教程(三)

函数操作 函数是重用的程序段。它们允许你给一块语句一个名称,然后你可以在你的程序的任何地方使用这个名称任意多次地运行这个语句块。这被称为 调用 函数。我们已经使...

2339
来自专栏编码小白

tomcat源码解读三(2) tomcat中JMX的源码分析

     在这里我是将tomcat中的jmx给拆分出来进行单独分析,希望通过此种方式能够尽可能的出现更多的问题,以便对其有更多的了解,首先需要声明的是tomca...

5335
来自专栏老付的网络博客

详解.net中IL语言

中间语言,又称(IL语言)。充当Clr与.net 平台的中间语言,比如用C#编写程序,编译器首先是把C#代码转译成IL语言,最终由Clr解释执行,下面我们学习下...

1672
来自专栏GreenLeaves

C#多线程学习一

一、概述:C#支持多线程并行执行程序,一个线程有他单独的执行路径,能够与其他线程同时执行,一个程序是由一个单线程开始,该单线程由CLR(公共语言运行时)和操作系...

2797
来自专栏丑胖侠

《Drools7.0.0.Final规则引擎教程》第4章 Function函数

Function函数 首先来看一下function函数的语法结构图: ? 函数是将语义代码放置在规则文件中的一种方式,就相当于java类中的方法一样。函数...

2228
来自专栏GuZhenYin

C#7.0之ref locals and returns (局部变量和引用返回,之前欠大家的,现在补上)

没看过原文的请移步:[干货来袭]C#7.0新特性(VS2017可用) 废话不多说,直接进入正题. 首先我们知道 ref关键字是将值传递变为引用传递 那么我们先来...

2039
来自专栏金朝麟的专栏

Module.exports和exports的区别

学习Seajs时,看到了exports.doSomething和module.exports,想对这两者的区别一探究竟。官方解释因为SeaJs和Nodejs都是...

1900
来自专栏机器学习和数学

[编程经验]python2和python3的区别总结

最近涨粉涨的厉害啊,那天看刚破800,今天打开又有32个新粉丝,有点开心,哈哈哈。说实话,看的人多的话,是我坚持下去最大的动力。。。 = = = print("...

3124
来自专栏大内老A

ModelBinder——ASP.NET MVC Model绑定的核心

Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数。通过前面的介绍我们知道Action方法的参数通过ParameterDescrip...

2379

扫码关注云+社区

领取腾讯云代金券