C#的新特性(C#核心技术浅解)

💞哈喽!大家好,我是HappyGirl快乐女孩💞
😜是一位爱好技术的【技术Fans】!😜


💞💞💞 如果有对技术感兴趣的宅友,欢迎关注💞💞💞
❤️❤️❤️感谢各位❤️❤️❤️

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

目录

目录

1️⃣ C#的发展历程

2️⃣ C#的新特性

3️⃣ C#的新特性-C#可为空类型

可为空值类型

 C#可为空引用类型

可为空上下文

4️⃣ C#的新特性-属性模式

5️⃣ C#的新特性-Json处理

6️⃣ C#的新特性-span和Memory


1️⃣ C#的发展历程

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


例如他20岁时花了仅仅两三周就开发出来了一种Pascal编译器。之后他又开发出了Delphi,这是一种非常神奇的语言,在面向过程式开发方法的时代,Delphi能够与VB独占半边天,其优秀之处显然不是区区几句话就能说清楚。

再后来,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次正式版本发布,对于许多开发者而言,每一次版本升级也意味着又需要刷新技术面,着实是一种痛并快乐的过程。
 

2️⃣ C#的新特性

3️⃣ C#的新特性-C#可为空类型

可为空值类型


可为空值类型是针对基础类型而言,例如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这种类型对可为空值类型进行检查。

 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 性警告。

示例:


<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:将注释警告上下文还原到项目设置。
 

4️⃣ C#的新特性-属性模式


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", 
}; 

 

5️⃣ C#的新特性-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进行更新。
 

6️⃣ C#的新特性-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

文章来源于【dotNet编程大全  】


该文章知识作为个人笔记,大部分知识来源于书本或网络整理总结;
 


走过路过,就点个赞吧呗!送你小心心哦💞💞💞

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C# 7.0 核心技术指南是一本关于C#编程语言的指南,它包含了许多有关C# 7.0的核心技术的内容。该指南涵盖了C# 7.0的特性和功能,如模式匹配、元组、本地函数等。 在C#编程中,.NET Core以及ASP.NET Core是用来开发易于部署的Internet应用程序和微服务的开源框架。这些框架提供了丰富的功能和工具,使开发人员能够更轻松地构建高性能、可靠性和可扩展性的应用程序。 在C#编程中,也可以使用指针来进行显式内存分配。尽管C#并未抛弃指针,但在大多数编程任务中是不需要使用指针的。然而,对于性能优先的热点和互操作性,仍然可以在标记为unsafe的程序块内使用指针。 另外,你提供的代码示例是关于线程的。在C#中,可以使用线程来实现并发执行。通过创建一个的线程,你可以在该线程上执行一些耗时的操作,同时主线程可以继续执行其他任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C#7.0核心技术指南学习笔记(一)C#和.NET Framework简介](https://blog.csdn.net/weixin_46858064/article/details/130142100)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [C#7.0核心技术指南第14章14.2线程](https://blog.csdn.net/superfreak/article/details/124242752)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HappyGirl快乐女孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值