当前位置: 首页 > 科技观察

如何掌握C#的核心技术

时间:2023-03-22 01:52:34 科技观察

本文转载自微信公众号“DotNET技术圈”,作者邹希源。转载本文请联系DotNET技术圈公众号。介绍不久前看到一个故事。某年,宁波交警引进人脸识别技术抓拍行人闯红灯。结果,珠海女子董女士被查出是一天内闯红灯次数最多的人。她每天闯红灯3000多次。宁波交警连夜研究抓捕方案,最终查明公交车上某核心产品广告被误判。这家制造公司号称掌握了核心。虽然不是每一款产品都是爆款,但这样的广告确实牢牢抓住了受众的眼球。简洁明了的广告,使产品更具鲜明的标签,形成其独特的品牌形象。最近,我看到一家大型汽车制造商。虽然业绩不是很好,但董事长的眼光还是让人佩服。在股东大会上,当有股东问到自己以往业绩不佳,是否有兴趣与某民族品牌在无人驾驶技术方面建立进一步的合作关系时,董事长也毫不犹豫地回答:“我不接受“来自xx的offer。无人驾驶整体解决方案需要将核心技术掌握在自己手中。”至于这家公司是否真正掌握了核心技术,有的读者可能是公司的产品用户,也可能是汽车行业的员工,甚至是股东,可能比较清楚,小编比较好,了解的不多关于这个核心技术,但是小编从这两个案例中发现了一个现象,核心技术对于公司和个人来说都是非常有价值的关键特性,掌握了核心技术的开发者一定是逃过一劫的专业开发者从低层利益出发,面对纷繁复杂的互联网时代,他往往有更多机会展现自己的才能,获得与实力相匹配的待遇,掌握核心技术无疑也是如此。C#那么,问题来了,C#的核心技术是什么?我们如何掌握C#的核心技术呢?众所周知,C#是由伟大的程序员大神AndersHejlsberg创造的,体现了C#的先进性。.NET技术是一种优秀的语言。说起AndersHejlsberg,虽然有些读者可能不太熟悉,但是说到他创造的几种语言或者说编译器,大家想必都不陌生。例如,他在20岁时,仅用了两三个星期就开发出了Pascal编译器。后来他开发了Delphi,这是一门非常神奇的语言。在面向过程开发方式的时代,Delphi可以用VB独占半边天。显然,它的优秀并不是三言两语能说清楚的。当时很多开发者都非常善于用它创造奇迹。比如今天的产品大神张小龙,30年前就用它开发了foxmail。据说早期的wps也是用Delphi开发的。后来,Anders加入了微软,并设计了C#for.NET等优秀的语言。(当然,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#8.0核心技术指南》中的核心技术最近,有幸阅读了最新出版的《C#8.0核心技术指南》,并在本文中提取了几个与C#相关的新特性和概念,与大家分享。当然,由于C#实际上是.NETframework的主要语言,所以下面介绍的一些核心技术实际上也可能是.NETframework的核心技术,所以大家不必担心这个问题。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-8C#可空类型3.1可空值类型可空值类型是针对In基本类型的术语,例如Int?布尔?双倍的?这些基本类型是常用的可空值类型。这种类型出现的比较早,nullable值类型在C#2.0就已经出现了。检查可空值类型的实例从C#7.0开始,您可以使用is表达式来检查可空值类型,int?a=42;if(aisintvalueOfA){Console.WriteLine($"ais{valueOfA}");}else{Console.WriteLine("adoesnothaveavalue");}//Output://ais42当然,你仍然可以使用HasValue类型来检查可空值类型。3.2C#可空引用类型可空值类型常用于数据库检查。此类型可用于确定对象是否为空。可空引用类型正好相反,它可以在一定程度上防止引用类型的值为空,以避免抛出“对象引用未添加到对象实例”空指针异常。该类型从C#8.0开始引入,包括“可为空引用类型”和“不可为空引用类型”两种方式,使您可以对引用类型变量的属性进行重要声明:引用不应为空。当变量不应为null时,编译器会强制执行规则以确保在不首先检查这些变量是否为null的情况下取消引用这些变量是安全的:变量必须初始化为非null值。永远不能为变量分配值null。引用可能为空。当一个变量可以为null时,编译器会强制执行不同的规则以确保您已正确检查null引用:只有当编译器可以保证该值不为null时,您才能取消引用该变量。这些变量可以用默认值null初始化,或者在其他代码中赋值null。类型为Null。例如,在常用语句中,我们可能会这样实现:voidfoo(string?s)=>Console.WriteLine(s.Length);一旦字符串为空,很容易导致空指针异常。可空上下文可空上下文允许对编译器解释引用类型变量的方式进行细粒度控制。可以使用.csproj文件中的Nullable元素为项目设置可为null的注释上下文和可为null的警告上下文。此元素配置编译器如何解释类??型的可空性以及它生成哪些警告。有效设置如下:启用:“启用”是一个可为空的注释上下文。“已启用”可为null的警告上下文。引用类型的变量,例如字符串,是“不可为空的”。启用所有可空性警告。警告:“已禁用”可为空的注释上下文。“已启用”可为null的警告上下文。引用类型的变量被“忽略”。启用所有可空性警告。annotations:'enabled'可为空的注释上下文。“已禁用”可为null的警告上下文。引用类型(例如字符串)的变量不可为空。禁用所有可空性警告。禁用:“禁用”可为空的注释上下文。“已禁用”可为null的警告上下文。引用类型的变量被“忽略”,就像早期版本的C#一样。禁用所有可空性警告。示例:XML复制enable您还可以使用指令在项目中的任何位置设置这些相同的上下文:#nullableenable:将可为空的注释上下文和可为空的警告上下文设置为“enabled”。#nullabledisable:将可为空的注释上下文和可为空的警告上下文设置为“已禁用”。#nullablerestore:将可为空的注释上下文和可为空的警告上下文恢复为项目设置。#nullabledisablewarnings:将可为null的警告上下文设置为“已禁用”。#nullable启用警告:将可为空的警告上下文设置为“已启用”。#nullablerestorewarnings:将可为null的警告上下文恢复到项目设置。#nullabledisableannotations:将可为null的注释上下文设置为“已禁用”。#nullableenableannotations:将可为空的注释上下文设置为“已启用”。#nullablerestoreannotations:将注释警告上下文恢复到项目设置。属性模式C#在7.0引入了属性模式,通过属性模式可以快速匹配一个对象的一个??或多个属性值。比如我们可以使用这样的例子来快速匹配相关的属性值。if(objisstrings&&s.Length=4)除了这种属性模式,C#8.0中还引入了另一种模式。这种模式主要用于switch语句的使用,使用起来也很简单。boolShouldAllow(Urlurl)=>urlswitch{{Scheme:"http",Port=80}=>true,{Scheme:"https",port=443}=>true}属性方式也支持嵌套,如boolShouldAllow(Urlurl)=>urlswitch{{Scheme:string{Length:4},Port=80}=>true,{Scheme:"https",port=443}=>true}甚至支持使用when子句。比如:{Scheme:"http",Port:80}whenurl.Host.Length<1000=>true,这样的写法可以让我们的一些逻辑代码更加精简,看起来更加引人注目。属性也提供两种模式:元组模式和位置??模式。元组模式提供了一种切换多个值的简单机制,而??位置模式定义了使用对象的位置属性作为匹配模式的方式。这是官方文档中有关位置模式的示例。publicreadonlystructPoint{publicintX{get;}publicintY{get;}publicPoint(intx,inty)=>(X,Y)=(x,y);publicvoidDeconstruct(outintx,outinty)=>(x,y)=(X,Y);}staticstringClassify(Pointpoint)=>pointswitch{(0,0)=>"Origin",(1,0)=>"positiveXbasesend",(0,1)=>"positiveYbasisend",_=>"Justapoint",};不过官方文档并没有介绍元组模式的例子,但是在《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读取对象,使用Jsonwriter更新Json。Span和MemorySpan和Memory是.NET5中引入的新结构。是对数组、字符串或任意连续的托管或非托管内存结构的底层抽象,其主要目的是进行特定的微优化,尤其是编写低内存的需要尽可能少的内存分配(从而减少垃圾收集器的负载)分配代码。Span和Memory适用于各种性能热点。比如Asp.NETCORE的处理管道和字节流的解析是通用的,性能更好。跨度是在堆栈上分配的引用结构[1],而不是在托管堆上。Span表示任意内存的连续区域。下面是官方文档提供的例子://Createaspanoveranarray.vararray=newbyte[100];vararraySpan=newSpan(array);bytedata=0;for(intctr=0;ctrspan){varslice=span.Slice(16);returnint.Parse(slice);}}//Output://Contentlength:132结束语由于时间关系,本文仅对部分内容进行了简单梳理,不足以概括C#的核心技术,最适合深入理解C#核心技术的方式,除此之外通过官方学习网站了解,可能会得到一本深入介绍C#核心技术的书。跟着作者的节奏去接触相关的知识体系,了解相关的代码,手把手的去实践。虽然目前市面上关于C#相关技术的书籍很多,但还是推荐机械工业出版社华章IT出版的这本书。作者在介绍中还提到,本书将解答你在C#8.0或.NETCORE学习过程中遇到的各种问题。本书围绕概念和用例进行组织,不仅提供简明的C#和.NET知识体系,还进行了一系列深入探索。虽然最新的C#已经刷新到10.0预览版了,但是翻译书籍的发布速度可能没有那么快了。连C#9.0最早也要明年才能出版,所以这本书《C#8核心技术指南》是目前市面上介绍C#8最成熟最系统的一本书。