我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何掌握C#的核心技术

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何掌握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表达式对可为空值类型进行检查,

  1. int? a = 42; 
  2. if (a is int valueOfA) 
  3.     Console.WriteLine($"a is {valueOfA}"); 
  4. else 
  5.     Console.WriteLine("a does not have a value"); 
  6. // Output
  7. // a is 42 

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

3.2 C#可为空引用类型

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

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

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

例如,在常用的语句中,我们可能这样实现:

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

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

可为空上下文

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

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

  1. enable 

:“启用”可为空注释上下文。“启用”可为空警告上下文。

引用类型的变量,例如 string 是“不可为空”。启用所有为 Null 性警告。

  1. warnings 

:“禁用”可为空注释上下文。“启用”可为空警告上下文。

引用类型的变量是“无视”。启用所有为 Null 性警告。

  1. annotations 

:“启用”可为空注释上下文。“禁用”可为空警告上下文。

引用类型的变量(例如字符串)不可为 null。禁用所有为 Null 性警告。

  1. disable 

:“禁用”可为空注释上下文。“禁用”可为空警告上下文。

引用类型的变量是“无视”,就像早期版本的 C# 一样。禁用所有为 Null 性警告。

示例:

XML复制

  1. enable 

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

  • #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中引入了属性模式,通过该模式,可以快速匹配对象的一个或多个属性值。例如,我们可以使用这样的示例快速匹配相关属性值。

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

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

  1. bool ShouldAllow(Url url)=>url switch   
  2. {   
  3.      {Scheme:"http",Port=80}=>true,   
  4.      {Scheme:"https",port=443}=>true   
  5. }   

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

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

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

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

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

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

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

  1. public readonly struct Point  
  2. {  
  3.     public int X { get; }  
  4.     public int Y { get; }   
  5.  
  6.     public Point(int x, int y) => (X, Y) = (x, y); 
  7.  
  8.     public void Deconstruct(out int x, out int y) => (x, y) = (X, Y); 
  9.  
  10. static string Classify(Point point) => point switch 
  11.     (0, 0) => "Origin",   
  12.     (1, 0) => "positive X basis end",  
  13.     (0, 1) => "positive Y basis end",  
  14.     _ => "Just a point",  
  15. };  

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

Json处理

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

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

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

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

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

Span和Memory

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

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

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

  1. // Create a span over an array. 
  2. var array = new byte[100]; 
  3. var arraySpan = new Span(array); 
  4.  
  5. byte data = 0; 
  6. for (int ctr = 0; ctr < arraySpan.Length; ctr++) 
  7.     arraySpan[ctr] = data++; 
  8.  
  9. int arraySum = 0; 
  10. foreach (var value in array) 
  11.     arraySum += value; 
  12.  
  13. Console.WriteLine($"The sum is {arraySum}"); 
  14. // Output:  The sum is 4950 

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

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

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

  1. using System; 
  2.  
  3. class Program 
  4.     static void Main() 
  5.     { 
  6.         string contentLength = "Content-Length: 132"
  7.         var length = GetContentLength(contentLength.ToCharArray());     
  8.         Console.WriteLine($"Content length: {length}");  
  9.     } 
  10.  
  11.     private static int GetContentLength(ReadOnlySpan<char> span) 
  12.     { 
  13.         var slice = span.Slice(16); 
  14.         return int.Parse(slice);     
  15.     } 
  16. // Output
  17. //      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最成熟、最系统的的书籍。

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何掌握C#的核心技术

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何掌握C#的核心技术

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

如何高效掌握javase 和 java 的核心技术?(如何掌握javase和java的核心技术)

在当今的软件开发领域,Java语言无疑是最为广泛使用的编程语言之一。而JavaSE(JavaPlatform,StandardEdition)作为Java平台的基础版本,掌握其核心技术对于成为一名优秀的Java开发者至关重要。本文将为你详细介绍如何掌握JavaSE和
如何高效掌握javase 和 java 的核心技术?(如何掌握javase和java的核心技术)
Java2024-12-16

你必须掌握的21个Java核心技术!

经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容。
JavaJVM命令2024-12-03

PHP代码审计:实战演练,掌握核心技术

PHP代码审计实战演练,掌握核心技术,从理论到实践,深刻理解PHP代码审计的精髓,提升安全防护能力。
PHP代码审计:实战演练,掌握核心技术
2024-02-09

如何掌握 OpenGauss 数据库核心技术?秘诀之一:拿捏SQL引擎

数据库的SQL引擎是数据库重要的子系统之一,它对上负责承接应用程序发送过来的SQL语句,对下则负责指挥执行器运行执行计划。其中优化器作为SQL引擎中最重要、最复杂的模块,被称为数据库的“大脑”,优化器产生的执行计划的优劣直接决定数据库的性能

掌握核心技术:Go语言项目开发经验总结

掌握核心技术:Go语言项目开发经验总结近年来,随着互联网行业的快速发展,各种新的编程语言也纷纷出现,并成为开发者们的新宠。其中,Go语言作为一门开源的静态编译型语言,以其并发性能好、执行效率高等优势,备受众多开发者的喜爱。作为一个Go语言开
掌握核心技术:Go语言项目开发经验总结
2023-11-02

大数据学习必须掌握的五大核心技术有哪些?

大数据应用已成为行业热点和产业发展新增长点,同时大数据技术的体系庞大且复杂,基础技术范畴广,技术层面多。数据处理遵循一个通用化的处理框架,本文即从数据采集与预处理、数据存储、数据清洗、数据查询分析和数据可视入手讲解大数据五大核心技术。

VUE Nuxt.js中间件的奥秘:掌握核心技术,打造卓越应用

Nuxt.js 凭借其强大的中间件功能,使开发人员能够在应用程序的不同层级轻松扩展其功能。本文将深入剖析 Nuxt.js 中间件的奥秘,帮助您掌握核心技术,构建卓越的应用程序,同时提供代码示例,使理解更加直观。
VUE Nuxt.js中间件的奥秘:掌握核心技术,打造卓越应用
2024-02-15

一文带您理解Selenium 和 BeautifulSoup:掌握数据抓取的核心技术

网站数据爬取是一项全栈技术,涉及 HTTP、HTML、Python、Selenium、BeautifulSoup 和正则表达式等工具。成功抓取依赖于对网页结构的理解、绕过防爬机制及流量控制。

Python爬虫:如何快速掌握Python爬虫核心技术,批量爬取网络图片

对于爬虫,很多伙伴首选的可能就是Python了吧,我们在学习Python爬虫的时候得有侧重点,这篇文章教大家如何快速掌握Python爬虫的核心!有不清楚的地方,可以留言!1. 概述本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片
2023-06-02

掌握核心技术要点:Go语言项目开发经验总结

掌握核心技术要点:Go语言项目开发经验总结近年来,Go语言作为一种新兴的编程语言,逐渐在互联网行业中得到广泛应用。它以简洁、高效和并发性强的特点,成为了很多公司和开发者的首选语言。在实际的项目开发中,我们经历了许多挑战和探索,积累了一些经验
掌握核心技术要点:Go语言项目开发经验总结
2023-11-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录