快速入门系列--深入理解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由于在字符串左侧补零。
参考资料
- (英)Jon, Skeet. 《深入理解C#(第3版)》[M]. 北京:人民邮电出版社, 2014.
- 如何构建智能反垃圾邮件的WordPress插件
- 【深入研究】使用RNN预测股票价格系列一
- 【深入研究】使用RNN预测股票价格系列二
- 教你用一行Python代码实现并行(附代码)
- 在美国国会图书馆标题表的SKOS上运行Apache Spark GraphX算法
- 【精选】破解波动性突破实盘系统
- 从程序员的角度看神经网络的激活功能
- 在线矩阵微积分工具,可以生成 Python/Latex 代码哦!
- 机器学习应用区块链系列(一)——如何开发一套自己的智能合约系统
- 使用Botkit和Rasa NLU构建智能聊天机器人
- 【量化投资】缠论面面观(附Python源码)
- 独家 | 教你用Q学习算法训练神经网络玩游戏(附源码)
- 使用重采样评估Python中机器学习算法的性能
- Autofac正式发布2.1版
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 模型性能提升操作
- FM算法解析及Python实现
- 排序算法:快速排序解析及Python实现
- dubbo学习之本地存根实践
- vue3.0 加载json的“另类”方法(非ajax) 定义组件.vue文件
- pyhon3 安装 web 出错 ERROR: No matching distribution found for web
- tensorflow gpu 运行出现OOM错误
- jquery getJSON不执行问题解决
- python函数——创建文件夹
- 数据结构算法操作试题(C++/Python)—— 组合总和
- Android大厂收割秘籍:太难了,准备半年,腾讯/快手/美团外卖面试中的那些辛酸坎坷史
- leetcode链表之合并两个排序的链表
- 2020-09-09:裸写算法:两个线程轮流打印数字1-100。
- python中线程池使用
- 还在手动部署SpringBoot应用?试试这个自动化插件!