.NET 生态系统的蜕变之 .NET 6

.NET 6 是自.NET 4 框架以来生态系统看到的最大版本更新,虽然.NET Core 是2014年开始非常大的一项重大战略举措,但是.NET 6是真正的具有强大动力的非常重要的版本。

2021年11月9日即将正式发布的.NET 6, 也许你认为.NET 5才刚刚发布,我才刚开始使用.NET Core 3.1, .NET6 就又要发布了 ,没错的,.NET 5是2020年11月10日发布,.NET Core 3.1早在2019年12月就发布了,微软已经承诺了每年都会发布一个版本的.NET , .NET 6正是按照时间表发布的版本。和这个版本发布节奏对应有一个支持政策:https://dotnet.microsoft.com/platform/support/policy/dotnet-core#cadence

a28cb8773d77ca5a27d58f2c61e1ef14.png

从.NET 5开始,奇数版本版本18个月修补丁周期,而偶数版本有 三年 的修补丁周期。如果您已经将应用迁移到.NET Core 3.1,请注意,它有一个为期三年的修补丁周期,将于 2022 年 12 月结束;如果您仍在任何之前版本的 .NET Core上,则您目前已不在支持周期内。虽然尚未宣布对.NET框架 4.6.2 及以后的支持正式结束,但微软表示,.NET 框架 4.8 是.NET 框架的最后一个主要版本,将会随Windows 的支持计划更新:新的功能开发应针对以前称为 .NET Core(例如.NET 6)的平台。

.NET 6 带来了许多性能改进和生产力提升,而且还是一个长期支持版本 。在.NET 的每个连续版本中,.NET 在执行速度和内存使用方面都取得了一些令人印象深刻的进步。如果你一直没有跟踪, 你很可能会被. NET 框架的累积收益吹走。这一点你可以看看Techempower的测试的报告,具体参见 https://www.techempower.com/benchmarks/#section=data-r20&hw=ph&test=composite

变化很大

我们从 .NET 5开始向前看,作为长期支持 (LTS) 版本,.NET 6 代表着进一步的改进,并具有大量的设计和性能改进。我们将主要看看ASP.NET 6 运行时间的性能改进列表和.NET 6 中的中断更改,可以看到变化非常大。

C# 语言更新

C#语言的最新版本是10.0,有几个有趣的变化,对于爱整洁的csharper 来说,全局引用(Global using)和 文件范围的命名空间 是很好的互补。现在,您可以声明适用于整个编译单元(很可能是项目)的全局使用,并避免到每个文件顶部的去添加相同指令集。文件范围的命名空间还允许您声明适用于给定文件中所有代码的命名空间,无需单行无需更多匹配卷曲大括号,源文件中的凹痕级别也较少。

以前

CSharp9_Widget.cs
using System;
using System.Collections.Generic;
using System.Linq;namespace MyNamespace.Data
{class Widget{private List<WidgetPart> _widgetParts;public IEnumerable<WidgetPart> RequiredParts => _widgetParts;public bool RequiresPart(int partId) => _widgetParts.Any(x => x.Id == partId);}
}
CSharp9_WidgetPartsInventory.cs
using System;
using System.Collections.Generic;
using System.Linq;namespace MyNamespace.Data
{class WidgetPartsInventory{private Dictionary<int, WidgetPart> _widgetPartsById;public bool HavePartsToBuildWidget(Widget widget) => widget.RequiredParts.All(p => _widgetPartsById.ContainsKey(p.Id));}
}

现在:

CSharp10_GlobalUsing.cs
global using System;
global using System.Collections.Generic;
global using System.Linq;
CSharp10_Widget.cs
namespace MyNamespace.Data;class Widget
{private List<WidgetPart> _widgetParts;public IEnumerable<WidgetPart> RequiredParts => _widgetParts;public bool RequiresPart(int partId) => _widgetParts.Any(x => x.Id == partId);
}
CSharp10_WidgetPartsInventory.cs
namespace MyNamespace.Data;class WidgetPartsInventory
{private Dictionary<int, WidgetPart> _widgetPartsById;public bool HavePartsToBuildWidget(Widget widget) => widget.RequiredParts.All(p => _widgetPartsById.ContainsKey(p.Id));
}

还有其他一些与Record、模式和插值字符串相关的更新,但这些更新大多是语法糖。

ASP.NET Core 更新

如果你阅读每个版本的说明,很容易看到 ASP.NET Core 是一个核心,从网络主机和最小 API,热重载 到blazor都有很多感兴趣特性。

机和最小 API,热重载 到blazor都有很多感兴趣特性。

网络主机和最小 API

从 ASP.NET Core开始,每个应用程序都将应用初始化代码拆分为Program.cs(用于创建 Web 主机)和"Startup.cs(用于配置路由和 IoC 容器配置等应用程序问题)中,通常包含的两个单独的Class。特别是Startup类有一种神奇的感觉,它的方法从来没有被开发人员直接调用。而是WebHost在幕后自动调用配置方法。

ASP.NET团队分析了这个设计,并与其他 Web 框架相比,认为设置涉及的东西太多。因此,最小的API概念诞生了。现在,应用程序初始化可以全部包含在一个文件中。而且你可能感到奇怪,Main方法都不需要了。可以在应用设置中定义路由,从而大大减少代码数量以启动和运行一个应用程序。

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

当然如果你仍然喜欢将服务设置与应用配置分离的组织样式,你仍然可以为 IServiceCollection 和 IApplicationBuilder 创建扩展方法,并从构建器和应用程序对象调用它们。

Hot Reload

几年来,许多 Javascript 框架都支持热重载,现在它也成为 C#中 ASP.NET Core应用的标配:通过热重加载,您可以在应用运行期间(在调试器下)编辑您的 C#代码,并且您的代码更改将自动反映在您的应用中,而不会丢失应用状态。换句话说,应用程序不需要重新启动。对于调试和交互式开发工作流程来说,这应该是一个很好的改进。这个功能对于开发来说非常重要,就是这个小功能微软近日激怒了开源.NET社区,好消息是微软听取了社区的声音,恢复了通过CLI支持HotReload功能。具体参见 https://www.cnblogs.com/shanyou/p/15450214.html

Blazor

在 ASP.NET Core 6 里面有大量的更新是关于Blazor。例如,Blazor 应用程序现在可以直接编译到 WebAssembly,以便在 IL 解释(即.NET 本地编译)版本的相同代码上来提高应用程序速度。本地编译/调试体验仍然很快,因为漫长的编译时间仅适用于包装/发布。说到性能,Blazor WebAssembly可实现客户端代码的多线程。Javascript 受制于浏览器中的单线程。真正的多线程为可以从并行处理中受益的应用程序开辟了一些新的可能性(当然,这取决于浏览器的支持)。

还有一个非常有趣的功能,使 Blazor 可用于通过 MAUI 编写桌面应用程序。Blazor 的最大好处就是开发人员可以完全用 C# 编写 Web 应用程序,而不需要为了写前端必须切换到 Javascript。如果没有 C# 和 Javascript 之间的额外接缝,前端和后端代码之间就不需要映射层。可以在两侧使用相同的 C# 模型,这意味着需要的代码更少,因此开发应用程序所需的时间也更少。Blazor 桌面进一步扩展了这一概念,以允许此共享代码现在也可以与桌面应用程序无缝集成。

MAUI

MAUI 是 Multi-platform App UI 的缩写,是微软对跨平台 UI 框架的下一个尝试。MAUI 是 Xamarin 的演进,还包括桌面平台。它允许从单个代码库针对 iOS、Android、macOS 和 Windows。MAUI 处理对本机平台 API 的抽象,因此您可以以与平台无关的方式访问设备传感器等内容。对 Xamarin 的一种印象是,它们最终得到的界面很少,而且在任何平台上都不太好看。MAUI 将如何解决这一问题还有待观察。如果你关心的是跨多个平台的开发速度和维护成本,那么 MAUI 值得仔细研究。MAUI 要在2022年的第二个季度正式发布,建议当前采取观望的方法,进行小的尝试以了解平台在全面采用之前的长期发展方向。

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

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

相关文章

C语言程序读写文件(文件内存一个十进制数,每读一次数值加一)

1.问题&#xff1a;C语言程序实现读写一个txt文件&#xff0c;txt文件中存储一个十进制数、每读一次该数值加一。 2.实现&#xff1a;新建一个文件夹&#xff0c;在该文件夹中建一个outputFileName.txt文件、内容是&#xff1a;1&#xff0c;再在该文件夹中新建一个t.c文件、内…

php 电梯程序设计,教你写出京东电梯式轮播

效果知识点&#xff1a;企业布局技巧&#xff0c;如何高效的编写CSS样式&#xff0c;常用选择器&#xff0c;基本标签&#xff0c;盒子模型&#xff0c;jquery类库调用&#xff0c;JS特效编写&#xff0c;JS编程思维等。京东电梯式轮播源码&#xff1a;Document*{margin:0px;}/…

我看你还能坚持多久?!

1 我看你还能坚持多久&#xff01;▼2 依旧是熟悉的配方▼3 到哪儿都不愁工作......▼4 请问&#xff0c;当事喵作何感想&#xff1f;▼5 池塘危险&#xff0c;请勿靠近&#xff01;&#xff08;图源网络&#xff0c;侵删&#xff09;▼6 望周知&#xff01;▼7 实在是无…

查询一个表中所有id字段在另一个表中对应值的SQL语句怎么写?

编辑器加载中... 查询一个表中所有id字段在另一个表中对应值的SQL语句怎么写&#xff1f;多表联结查询:select rbd.RBDID, rbd.ProductCode,p.ProductCnName,p.[Standard],p.Impression,pb.BrandName,cgdw.UnitName,un.UnitName ,rbd.BuyingAmount,rbd.UnitPricefrom PCS_Requ…

CiberCut_5.6 标牌制作

CiberCut_5.6 标牌制作Elibrium.My.Professional.Business.Cards.v4.0 名片设计SummitSoft.Business.Cards.Plus.2004 名片设计SummitSoft.Label.Designer.Deluxe.2004 标签设计Teklynx.LabelView.Gold.v8.10.06 BrainVoyager QX 2.0.7 可视化核磁共振Dentrix.v10.5.4.4 牙医软…

Hello Blazor:(13)查找HTML元素对应.razor文件

前言Blazor是基于组件的开发&#xff0c;每个组件都是以一个.razor文件形式存在。当应用程序变得越来越大并且.razor文件的数量和层次结构越来越多时&#xff0c;想很快弄清页面上的HTML元素是由哪个组件生成的&#xff0c;就变得不那么容易了&#xff01;FindRazorSourceFile介…

C++STL之string (转)

在学习cSTL中的string&#xff0c;在这里做个笔记&#xff0c;以供自己以后翻阅和初学者参考。 1&#xff1a;string对象的定义和初始化以及读写 string s1; 默认构造函数&#xff0c;s1为空串 string s2(s1); 将s2初始化为s1的一个副本 string s3("valuee");…

当年的毒王熊猫烧香,现在怎么样了?

全世界只有3.14 % 的人关注了爆炸吧知识放假&#xff0c;小编来到了远在73公里之外的天后宫&#xff0c;终于是了了本命年的一桩心事。回想上一个本命年&#xff0c;当时小编还是沉迷扫雷和蜘蛛纸牌的孩子...但当时却发生了一件令我很不爽的事——“熊猫烧香”席卷全国&#xf…

$query php,phpQuery让php处理html代码像jQuery一样方便

简介如何在php中方便地解析html代码&#xff0c;估计是每个phper都会遇到的问题。用phpQuery就可以让php处理html代码像jQuery一样方便。DEMO我下的是onefile版&#xff1a;phpQuery-0.9.5.386-onefile.zip然后在项目中引用。html文件test.html&#xff1a;Spiderman City Driv…

《那些年啊,那些事——一个程序员的奋斗史》——126

段伏枥坐在宽敞的办公室&#xff0c;正在专心致志地研究文档的时候&#xff0c;一封邮件引发了自己的注意。邮件的内容很简单&#xff0c;主要是恭喜自己获得微软MVP候选人资格&#xff0c;请尽快填写完整的个人信息&#xff0c;以便于参与评选。 段伏枥看了这邮件&#xff0c;…

ip地址规划

子网划分好处&#xff1a;节约ip 便于管理 层次性 安全性子网数2的n次方&#xff0c;n为子网位。主机数2的N次方减2&#xff0c;N为主机数。VLSM&#xff08;variable-length subnet masks可变长子网掩码&#xff09;路由汇总好处&#xff1a;减小路由表规模 减轻路由器负担 减…

StackExchange.Redis 命令扩展

StackExchange.Redis 命令扩展Intro在之前的文章中有简单介绍过 StackExchange.Redis 直接调用 Redis 命令来实现调用 Stream 的根据消息 Id 来控制消息长度&#xff0c;因为 StackExchange.Redis 目前还不支持根据消息 Id 控制 Stream 消息长度&#xff0c;目前有很多 6.2 以后…

那个成人总会遇到的小问题……

结语超模君就问问&#xff1a;我还有机会10万&#xff0b;吗&#xff1f;&#xff08;溜了溜了&#xff09;莱布尼茨德国数学家莱布尼茨&#xff0c;被后人誉为“百科全书式的天才”&#xff0c;他的研究涉及逻辑学、力学等40多个领域。他创建了数学理论&#xff1a;微积分学。…

java继承接口和泛型,JavaSE习题 继承接口和泛型

问答题&#xff1a;1.子类在什么情况下可以继承父类友好成员&#xff1f;答&#xff1a;在同一个包内2.子类通过怎样的方法可以隐藏继承的成员变量&#xff1f;答&#xff1a;声明一个与父类相同变量名的成员变量3.子类重写继承的方法原则是什么&#xff1f;答&#xff1a;保证…

visual studio如何修改c++项目的.net framework框架版本

一、 修改项目文件 在 Visual Studio 的“解决方案资源管理器”中&#xff0c;打开项目的快捷菜单&#xff0c;然后选择“卸载项目”。 这将为你的项目卸载项目文件 (.vcxproj)。 在菜单栏上&#xff0c;依次选择“文件”、“打开”、“文件”。 在“打开文件”对话框中&#…

vertical-align

对于vertical-align属性&#xff0c;可以用于inline或者liline-block的元素&#xff0c;它需要一个参照物&#xff0c;此参照物是该行中最高的元素。转载于:https://www.cnblogs.com/lqzerogg/archive/2012/12/17/2822274.html

Qos、Tos、Cos、DSCP

严格的说&#xff0c;Cos与Tos只是QoS的一种标记机制。QoS范围太大&#xff0c;涉及到入口数据流的标记和分类及速率限制&#xff0c;网络骨干的拥塞避免和拥塞管理&#xff0c;网络出口的队列调度机制等等。Cos是二层ISL或者802.1Q数据帧的优先级标记&#xff0c;3个bit&#…

Github CodeSpaces 使用及定制化

Github CodeSpaces 使用及定制化IntroGithub 最近推出了很多令人兴奋的新功能&#xff0c;最近使用了 Github CodeSpaces&#xff0c;觉得还是挺不错的&#xff0c;CodeSpaces 相当于自己有了一个云主机&#xff0c;真正实现了云端开发&#xff0c;CodeSpaces 和 Github 做了很…

nat+端口转发,使得宿主机secureCRT可以访问vbox里linux虚拟机

为什么80%的码农都做不了架构师&#xff1f;>>> 环境&#xff1a;vbox或者叫vitrualbox连接虚拟机&#xff0c;由于公司内网不能分配IP&#xff08;不知道是不是这个原因&#xff09;&#xff0c;虚拟机用桥接得不到IP&#xff0c;没法实现虚拟机和宿主互相访问&am…

java 四字节uid,Java入门教程-序列化版本号serialVersionUID的作用

原标题&#xff1a;Java入门教程-序列化版本号serialVersionUID的作用Java序列化是将一个对象编码成一个字节流&#xff0c;反序列化将字节流编码转换成一个对象。序列化是Java中实现持久化存储的一种方法&#xff1b;为数据传输提供了线路级对象表示法。Java的序列化机制是通过…