快速入门系列--深入理解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 }}
View Code
复制代码

 

tip:

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

 

参考资料

  1. ()Jon, Skeet. 《深入理解C#(3)[M]. 北京:人民邮电出版社, 2014.
posted @   代码熊二  阅读(558)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示