如何掌握C#的核心技术


如何掌握C#的核心技术

原图来自网络,如有侵权,请联系小编删除。

引子

前不久看到一个段子,某年宁波交警引进人脸识别技术抓拍行人闯红灯,结果一天下来被发现闯红灯次数最多的是珠海女子董小姐,日闯红灯3000多次。宁波交警连夜研究抓捕方案,最后分析发现,原来是大巴车上的某掌握核心的产品广告被错误识别了。

这家自称掌握了核心的制造企业,虽然并非每个产品都卖座,但这样的广告词确实也牢牢抓住了观众的眼球,简单明了的广告词,使产品具备更加鲜明的标签,形成了其独特的品牌形象。

最近,又看到某汽车制造大厂,虽然业绩不怎么样,但其董事长的眼界之高令人钦佩。在股东会上,有股东询问过去业绩不佳,是否有兴趣在无人驾驶技术上跟某民族品牌建立进一步合作关系时,这位董事长也毫不犹豫的回答到:

“不接受xx提供的无人驾驶整体解决方案,要将核心技术掌握在自己手中。“

至于这家公司是否真的掌握了核心技术,也许有读者作为该公司的产品用户,或汽车产业从业人员,或甚至是股东,可能比较清楚,小编比较菜,对这种核心技术不太了解。

但小编从这两个案例发现了一个现象,核心技术无论对于公司而言,还是对于个人而言,都是非常有价值的关键特性。一个掌握了核心技术的开发者,必然是脱离了低级趣味的专业开发者,在纷繁复杂的互联网时代面前,往往有更多机会凸显自己的才华,进而获得与自己实力相匹配的待遇水平。

毫无疑问,掌握C#的核心技术也同样如此。那么,问题是,C#的核心技术有哪些呢?我们该如何掌握C#的核心技术呢?

C#的发展历程

众所周知,C#是由伟大的程序员之神Anders Hejlsberg为体现.NET技术的优势而创造出来的一种优秀语言。说起Anders Hejlsberg虽然可能有的读者不太熟悉,但说起他创造的几种语言或编译器,大家估计就并不陌生了。

例如他20岁时花了仅仅两三周就开发出来了一种Pascal编译器。之后他又开发出了Delphi,这是一种非常神奇的语言,在面向过程式开发方法的时代,Delphi能够与VB独占半边天,其优秀之处显然不是区区几句话就能说清楚,听说在当时,许多开发者都非常擅长使用其创造奇迹,例如今天的产品之神张小龙在30年前就曾经用其开发过foxmail,早期的wps据说也是使用Delphi开发出来的。

再后来,Anders加入了微软,并为.NET设计了C#这样一款优秀的语言。(当然,Anders并未止步于C#这样的成就,在C#之后,他又改良了Javascript,并为其带来了今天的“后端噩梦”TypeScript语言。)

2002年,C#随.NET战略一起发布,从一开始就被定位为.NET开发框架核心中的核心,直到今天,已经成为一种比较优秀的主流技术语言。这种语言吸收了其他语言的优势,同时又基于.NET框架的特性实现了许多优雅的功能,今天的C#,不仅仅能够用于传统的面向对象开发,也同样可以广泛使用于函数式开发方法。对于初学者而言,如果学过Java和C++语言,上手也非常容易。

经过将近20年的发展,C#语言已经迭代了15个主要版本,从最早期的C#1.0到现在最新版的9.0,及10.0预览版,共发布了6次正式版本发布,对于许多开发者而言,每一次版本升级也意味着又需要刷新技术面,着实是一种痛并快乐的过程。

回顾那么多个版本,你还记得哪些C#的“核心技术”给你带来过开发效率的巨大提升么?

《C#的核心技术指南》中的核心技术

最近,我有幸阅读了新出版的《C#8.0核心技术指南》,并在这篇文章中,我摘取了几个C#相关的新特性和概念跟大家一起分享。当然由于C#实际上是.NET框架的主力语言,以下介绍的一些核心技术,可能实质上是.NET框架的核心技术,大家不用纠结这个问题。

C#9.0新特性

参见https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-9。

C#8.0的新特性

参见https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-8

C#可为空类型

3.1 可为空值类型

可为空值类型是针对基础类型而言,例如Int?bool?double?这些基础类型都是我们常用的可为空值类型,该类型出现得比较早,在C#2.0中就已经出现了可为空值类型。

检查可为空值类型的实例

从C#7.0开始,可以使用is表达式对可为空值类型进行检查,

int? a = 42;
if (a is int valueOfA)
{Console.WriteLine($"a is {valueOfA}");
}
else
{Console.WriteLine("a does not have a value");
}
// Output:
// a is 42

当然,依然可以使用HasValue这种类型对可为空值类型进行检查。

3.2 C#可为空引用类型

可为空值类型常用于数据库的检查中,可以通过该类型判断对象是否为空,而可为空引用类型则恰好相反,可以一定程度上防止引用类型的值为空,避免引发 “未将对象引用添加到对象的实例”这样的空指针异常。

该类型自C#8.0 引入,包括两种方式“可为空引用类型”和“不可为空引用类型”,使你能够对引用类型变量的属性作出重要声明 :

•引用不应为 null。当变量不应为 null 时,编译器会强制执行规则,以确保在不首先检查它们是否为 null 的情况下,取消引用这些变量是安全的:•必须将变量初始化为非 null 值。•变量永远不能赋值为 null。•引用可为 null。当变量可以为 null 时,编译器会强制执行不同的规则以确保你已正确检查空引用:•只有当编译器可以保证该值不为 null 时,才可以取消引用该变量。•这些变量可以使用默认的 null 值进行初始化,也可以在其他代码中赋值为 null。类型为 Null 性例如,在常用的语句中,我们可能这样实现:

void foo(string? s)=>Console.WriteLine(s.Length);

一旦出现了string为空的情况,可能很容易就会引发空指针异常。

可为空上下文

可为空上下文可以对编译器如何解释引用类型变量进行精细控制。

可以使用 .csproj 文件中的 Nullable 元素为项目设置可为空注释上下文和可为空警告上下文。此元素配置编译器如何解释类型的为 Null 性以及生成哪些警告。有效设置如下:

enable

:“启用”可为空注释上下文。“启用”可为空警告上下文。•引用类型的变量,例如 string 是“不可为空”。启用所有为 Null 性警告。•

warnings

:“禁用”可为空注释上下文。“启用”可为空警告上下文。•引用类型的变量是“无视”。启用所有为 Null 性警告。•

annotations

:“启用”可为空注释上下文。“禁用”可为空警告上下文。•引用类型的变量(例如字符串)不可为 null。禁用所有为 Null 性警告。•

disable

:“禁用”可为空注释上下文。“禁用”可为空警告上下文。•引用类型的变量是“无视”,就像早期版本的 C# 一样。禁用所有为 Null 性警告。

示例

XML复制

<Nullable>enable</Nullable>

你还可以使用指令在项目的任何位置设置这些相同的上下文:

#nullable enable:将可为空注释上下文和可为空警告上下文设置为“已启用”。•#nullable disable:将可为空注释上下文和可为空警告上下文设置为“已禁用”。•#nullable restore:将可为空注释上下文和可为空警告上下文还原到项目设置。•#nullable disable warnings:将可为空警告上下文设置为“已禁用”。•#nullable enable warnings:将可为空警告上下文设置为“已启用”。•#nullable restore warnings:将可为空警告上下文还原到项目设置。•#nullable disable annotations:将可为空注释上下文设置为“禁用”。•#nullable enable annotations:将可为空注释上下文设置为“启用”。•#nullable restore annotations:将注释警告上下文还原到项目设置。

属性模式

C#在7.0中引入了属性模式,通过该模式,可以快速匹配对象的一个或多个属性值。例如,我们可以使用这样的示例快速匹配相关属性值。

if (obj is string s && s.Length=4) 

除了这种属性模式,还有一种是C#8.0中引入的模式,该模式主要用于switch语句的用法,使用起来也非常简洁。

bool ShouldAllow(Url url)=>url switch  
{  {Scheme:"http",Port=80}=>true,  {Scheme:"https",port=443}=>true  
}  

属性模式还支持嵌套,例如

bool ShouldAllow(Url url)=>url switch  
{ {Scheme:string{Length:4},Port=80}=>true, {Scheme:"https",port=443}=>true 
}  

甚至支持使用when子句。例如:

{Scheme:"http",Port:80} when url.Host.Length<1000=>true,  

这样的写法可以使我们部分逻辑代码变得更加精简,看起来更有逼格。

属性还提供了元组模式,位置模式两种模式,元组模式提供了切换多个值的简单机制,而位置模式则定义了使用对象的位置属性作为匹配模式的方式。

以下是官方文档关于位置模式的示例。

public readonly struct Point 
{ public int X { get; } public int Y { get; }  public Point(int x, int y) => (X, Y) = (x, y);public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
}static string Classify(Point point) => point switch
{(0, 0) => "Origin",  (1, 0) => "positive X basis end", (0, 1) => "positive Y basis end", _ => "Just a point", 
}; 

不过,官方文档并没有介绍元组模式的示例,而《C#8.0核心技术指南》中介绍了该模式的用法,大家可以从书中获取相关知识。

Json处理

过去,我们倾向于使用Json.NET来处理C#中的Json序列化问题,而现在,我们则可以依托官方库Sytem.Text.Json来完成。(虽然我们有时可能不愿意用,但往后官方的许多方法会更多的依赖该库来实现)。相比json.net,该官方库的主要优点是更简单、高效并且内存使用效率更高。

官方库提供了如下几种操作形式:

1、Utf8JsonReader:这是一种优化的前向Json读取器,用于读取Utf8编码的Json文本。

2、Uft8JsonWriter:这是一种Json输出器,可用于输出Utf8编码Json文本。

3、JsonDocument:该类型可以将Json数据解析为只读的DOM,可以用类似于XMLDocument的方式操作延迟加载的JsonElement示例。同时,也可以用JsonDocument读取对象,并使用Json写入器对Json进行更新。

Span和Memory

Span和Memory是.NET 5中引入的新的结构体。是数组、字符串或任意连续的托管内存或非托管内存结构的底层抽象,其主要目的是进行特定的微优化,尤其是编写需要尽可能降低内存分配(从而减轻垃圾回收器负载)的低内存分配代码。

Span和Memory适用于各种性能热点,例如Asp.NET CORE的处理流水线以及字节流的解析等操作常见,具有更佳的性能。Span<T> 是在堆栈上分配的 引用结构[1] ,而不是在托管堆上分配的。

Span<T>表示任意内存的连续区域。以下为官方文档提供的示例:

// Create a span over an array.
var array = new byte[100];
var arraySpan = new Span<byte>(array);byte data = 0;
for (int ctr = 0; ctr < arraySpan.Length; ctr++)arraySpan[ctr] = data++;int arraySum = 0;
foreach (var value in array)arraySum += value;Console.WriteLine($"The sum is {arraySum}");
// Output:  The sum is 4950

由于 Span<T> 是任意内存块的抽象,因此 Span<T> 具有参数的类型和方法的方法将 Span<T> 在任何对象上操作, Span<T> 而不考虑它所封装的内存类型。

Span<T> 包含方法的两个重载 Slice[2] ,该方法构成从指定索引处开始的当前范围的切片。这样一来,就可以将中的数据 Span<T> 作为一组逻辑块进行处理,数据处理管道的部分可以按需处理这些数据块,并对性能的影响最小。例如,由于新式服务器协议通常基于文本,因此字符串和子字符串的操作非常重要。

可以使用或删除此分配和复制操作 Span<T> ReadOnlySpan[3] ,如下面的示例所示:

using System;class Program
{static void Main(){string contentLength = "Content-Length: 132";var length = GetContentLength(contentLength.ToCharArray());    Console.WriteLine($"Content length: {length}"); }private static int GetContentLength(ReadOnlySpan<char> span){var slice = span.Slice(16);return int.Parse(slice);    }
}
// Output:
//      Content length: 132

结语

由于时间关系,本文仅对部分内容进行了简单整理,尚不足以对C#核心技术进行总结,而最适合深度了解C#核心技术的方式,除了通过官方学习网站来了解,可能就是获得一本深度介绍C#核心技术的书籍,跟着作者的节奏来接触相关知识体系,了解相关代码,并手把手的练上一练。

而虽然市场上目前介绍C#相关技术书籍比较多,我比较推荐机械工业出版社华章IT出版的这本《C#8核心技术指南》。作者的介绍也提到,这本书将回答你在C#8.0或.NET CORE学习过程中遇到的各种问题,该书围绕概念和用例进行组织,不但为中高级程序员提供了简明的C#和.NET知识体系,还进行了一系列深度探索。

虽然目前最新的C#已经刷新到10.0预览版,但翻译书的出版速度可能并没有那么快,即使是C#9.0,也最快要到明年出版,所以这本《C#8核心技术指南》算是市场上介绍C#8最成熟、最系统的的书籍。

References

[1] 引用结构: https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/struct#ref-struct
[2] Slice: https://docs.microsoft.com/zh-cn/dotnet/api/system.span-1.slice?view=net-5.0
[3] ReadOnlySpan: https://docs.microsoft.com/zh-cn/dotnet/api/system.readonlyspan-1?view=net-5.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zend_Feed 的项目实际应用

author songfengRSS0.9/1.0/2.0 ATOM 全部是内容聚合的应用&#xff0c;优点一是浏览者可以订阅其网站&#xff0c;能收到最新的网站更新内容&#xff0e;二是有利于搜索引擎抓取&#xff0e;个人感觉缺点是会被其它网站当成复制品&#xff0c;批量 抓取网站更新内容&…

mysqldump 的常用参数。

mysqldump 常用参数详解&#xff1a;--databases&#xff1a;备份多个数据库&#xff0c;选项后跟多个库名。备份文件中会包含USE db_name。--events : 备份事件--routines&#xff1a;备份存储过程和函数--ignore-tableTableName :指定不需要备份的表--tables&#xff1a;…

怪咖发明家,乔布斯给了他四亿,他没要,转身靠发明救了10亿人。

全世界只有3.14 %的人关注了青少年数学之旅提到乔布斯&#xff0c;大家会想到什么呢&#xff1f;苹果公司创始人&#xff1f;iPhone手机&#xff1f;iPad?人生赢家&#xff1f;不过大家肯定没有想到乔布斯也有吃瘪的时候&#xff1a;有一次&#xff0c;乔布斯对电动平衡车赛格…

西北纺织工学院97级计算机系学生毕业名单,原西北纺织工学院更名为西安工程大学...

原西北纺织工学院&#xff0c;曾更名为西安工程科技学院&#xff0c;2006年2月更名为西安工程大学。西北纺织工学院位于世界闻名的历史文化古都西安市&#xff0c;是中国纺织总会直属高等院校&#xff0c;也是我国西北和西南地区唯一的一所纺织高等学府&#xff0c;担负着培育纺…

祝贺|合肥.NET俱乐部第二期技术沙龙活动圆满成功

热烈祝贺合肥.NET俱乐部第二期技术沙龙圆满成功&#xff0c;感恩参与活动的每一位小伙伴&#xff01;正是因为有你们才促成了这次聚会的成功。现对此次活动进行简单回顾并附上精彩的活动图片&#xff0c;每一位参与活动者名单&#xff0c;以及此次活动讲师分享的PPT供大家学习下…

几个常用的JS代码.

//函数列表function PostCookie(cookieName) { var expdate new Date(); expdate.setTime(expdate.getTime() 604800000); document.cookiecookieName";expires"expdate.toGMTString()";path /;domain.52z.com"; }//用于产生随机轮转广告 i 随机个…

SQL中合并多行记录的方法总汇

SQL中合并多行记录的方法总汇——前几天还在抱怨&#xff1a;sql只有sum(数值)&#xff0c;不能sum(字符串)——如果不是分组统计&#xff0c;用select values values , value也是可以的——但是如果是分组sum(字符串)&#xff0c;肯定不行了&#xff01;——下面是用函数实…

Python中文编码判别及转换

为什么80%的码农都做不了架构师&#xff1f;>>> 养成使用utf8格式的习惯&#xff0c;但是不能保证所有的代码都是utf8格式&#xff0c;所以这里提供三个函数 getCoding tran2UTF8 tran2GBK &#xff0c;分别是查看编码格式&#xff0c;转换为utf8&#xff0c;gbk格…

计算机二级中制作流程图的视频教程,流程图怎么做?1分钟教会你流程图制作方法...

流程是指在特定情景下用一系列逻辑满足特定用户需求的一种总结&#xff0c;借助流程图不仅可以梳理产品需求背后的逻辑和流程&#xff0c;还可以将新的想法和概念借助流程图这个载体分享出来&#xff0c;让整个项目参与者更好的认知产品设计的思路和逻辑。为了让职场的你更好的…

Source Generators实现简版AutoMapper

问题在业务开发中&#xff0c;我们常常需要将一个对象映射成另一个对象。例如将领域实体(UserEntity)映射成暴露给服务外部使用的数据传输对象(UserDto)。而AutoMapper则是目前主流的解决方案&#xff0c;实现类似如下代码&#xff1a;var configuration new MapperConfigurat…

15岁大学毕业,一生800多篇专著论文,双眼失明却凭一条公式称霸数学界

全世界只有3.14 %的人关注了青少年数学之旅从文明之火初燃的那一刻起数学就与之为伴从万年前“数”的产生到现代科技的迅猛发展数学不仅是窥探宇宙万物的入口也是最高智慧的结晶在漫漫的人类历史长河中各个伟大的数学家犹如布满“数学星空”中的星群他们追求最高的精确最合理的…

SEO | 重新认识一下Meta标签

很多人忽视了HTML标签META的强大功效&#xff0c;一个好的META标签设计可以大大提高你的个人网站被搜索到的可能性&#xff0c;有兴趣吗&#xff0c;谁我来重新认识一下META标签吧&#xff01; META标签是HTML语言HEAD区的一个辅助性标签&#xff0c;它位于HTML文档头部的<H…

不知道为什么IList.Contains()总是返回FALSE

需要override bool Equals(object obj) 转载于:https://www.cnblogs.com/shiningrise/archive/2009/04/16/1436845.html

Java程序员应该知道的10个Eclipse调试技巧

为什么80%的码农都做不了架构师&#xff1f;>>> Eclipse是众多Java程序员实用的开发工具&#xff0c;其中开发技巧也是繁多&#xff0c;但作为优秀的Java程序员&#xff0c;需要掌握最起码的调试技巧。 1 条件断点 2 异常断点 3 监视点 4 评估/检查 5 修改变量值 6…

计算机课程建设 指导思想,计算机基础精品课程建设实施方案(规划).doc

计算机基础精品课程建设实施方案(规划).doc《计算机基础》精品课程建设实施方案(规划)21 世纪人类将进入信息化社会&#xff0c;知识和信息是推动信息社会发展的直接动力。利用计算机进行信息的获取、分析处理、传递交流和开发应用的能力是信息社会的人才必须具备的素养&#x…

.NET 6 中的 LINQ 更新

.NET 6 中的 LINQ 更新Intro在 .NET 6 中会针对 Linq 提供更好的支持&#xff0c;之前可能我们通过自定义扩展方法来实现的功能&#xff0c;现在官方直接支持了。Linq 将更加强大&#xff0c;更好地帮助我们简化应用程序代码。Better Index & Range supportIndex 和 Range …

SOA架构师注意的问题

什么是SOA架构设计师的职责? 那什么是企业级SOA架构设计师的具体角色呢?什么是SOA架构设计师与设计和开发人员之间的差别呢?相信这些都是使大家最容易产生迷惑的问题。举个实际的例子来说&#xff0c;当构建一个基于SOA架构的系统的时候&#xff0c;针对一个具体的 service&…

计算机如何选件组装硬盘,组装电脑如何配置 组装电脑须知事项【详解】

对于现在的It男来说&#xff0c;组装电脑是一件再小不过的事情了。如果不太懂电脑硬件的朋友&#xff0c;可能组装电脑还是有一些困难&#xff0c;下面我们简单的来说说电脑是如何组装的&#xff0c;最新的电脑配置单情况是怎么样的。电脑组装主要有选件、检查配件、点亮主板、…

crontab定时任务中文乱码问题

手动执行都很正常的的脚本&#xff0c;添加到定时任务中日志文件全是乱码经过多方查证终于找到了原因&#xff01;crontab启动的任务没有获取系统的环境变量&#xff0c;导致中文乱码解决办法&#xff1a; 在执行的脚步中添加编码方式或者添加对应的环境变量如&#xff1a;1、…

.NET 平台采用率的提升归功于开源

微软近日发布了一篇博客&#xff0c;以对话形式与 .NET 工程师探讨了一下有关 .NET 项目的开源经验和心得。其中指出&#xff0c;.NET 软件开发平台采用率的提升主要归功于开源。根据介绍&#xff0c;微软在 2015 年将其 CoreCLR .NET 执行引擎作为开源发布&#xff0c;并在 20…