重磅发布 | 更快、更强的 .NET 7

news2024/11/26 2:29:24

.NET Conf 2022在11⽉8⽇11点正式开始了,为期三天的会议(11⽉8-10⽇),围绕 .NET 7 展开。相信各位⼩伙伴都已经开始安装 .NET 7 正式版本以及相关的开发⼯具。这次 .NET 7 围绕传统的 C#,ASP.NET Core, Blazor, .NET MAUI, 云原⽣等内容进行了更新。下面归类总结⼀下大家比较关心的更新内容,希望能给各位⼩伙伴⼀个快速的介绍。

C# 11 新增的六大功能

1. 泛型属性 - Generic attributes

泛型是编程语⾔的一种风格。让程序员在强类型程序设计语⾔中编写代码使⽤⼀些以后才指定的类型。C# 在2.0 开始⽀持泛型,C# 版本更替时不断对泛型的⽀持进⾏了增强和补充。在 C# 11 中,增加了泛型属性。

这是⼀段 ASP.NET 的代码,每个字段都有⼀些要求属性,如必填的字段,限制范围,以及对应的类型等。

public class Movie
{
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Title { get; set; } = null!;
[ClassicMovie(1960)]
[DataType(DataType.Date)]
[Display(Name = "Release Date")]
public DateTime ReleaseDate { get; set; }
[Required]
[StringLength(1000)]
public string Description { get; set; } = null!;
[Range(0, 999.99)]
public decimal Price { get; set; }
public Genre Genre { get; set; }
public bool Preorder { get; set; }
}

你可以通过 System.Attribute 派⽣出不同的属性。

在 C# 11 之前你也可以去做泛型属性的定义,通过 System.Type 在⾃定义属性类中作为构造函数的参数进⾏传递。

[AttributeUsage(AttributeTargets.Class)]
public class Conditions: Attribute
{
public Conditions(Type t)
{
ParamType = t;
}
public Type ParamType { get; }
}

实现

[Conditions(typeof(string))]
public class Player
{
public string Number { get; set; }
public string Name { get; set; }
}

⽽ C# 11 增加了对泛型属性的支持。直接定义⼀个泛型类,不⽤再将 System.Type 作为参数传递给构造函数。而且可以有⼀个或者多个类型作为参数, ⽽且类型安全性也增加了。

[AttributeUsage(AttributeTargets.Class)]
public class Conditions<T>: Attribute
where T : class
{
public Conditions()
{
}
public T ParamType { get; }
}
[Conditions<string>()]
public class Player
{
public string Number { get; set; }
public string Name { get; set; }
}

因为有了泛型类的加持,您可以在类型参数上灵活添加不同的条件约束。

2. 原始字符串 - New Raw string literals

在定义字符串时,我们往往夹杂着很多的符号,换⾏还有空格,但过往这些都需要增加转移字符,但现在通过原始字符串可以让字符串定义更为简单,也更容易给⼈接受。

string longMessage = """
   This is a long message.
   It has several lines.
        Some are indented
                 more than others.
   Some should start at the first column.
   Some have "quoted text" in them.
   """;

3. 列表模式 - List patterns

从 C# 11 开始,可以将数组或列表与模式的序列进⾏匹配,如以下示例所示: 

int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers is [1, 2, 3]); // True
Console.WriteLine(numbers is [1, 2, 4]); // False
Console.WriteLine(numbers is [1, 2, 3, 4]); // False
Console.WriteLine(numbers is [0 or 1, <= 2, >= 3]); // True

这个虽然看似是语法糖,但是对于⼀些数据处理的场景时⾮常有⽤的,例如 CSV 或者事固定⻓度的⽂件数。

4. 字符串插值中的换⾏符 - Newlines in string interpolations

以前,字符串插值 {text} 的⽂本只允许⼀⾏。现在在 C# 11 中,此⽂本可以允许多⾏。$ 特殊字符将字符串⽂本标识为内插字符串。内插字符串是可能包含内插表达式的字符串⽂本。将内插字符串解析为结果字符串时,带有内插表达式的项会替换为表达式结果的字符串表示形式。

string message = $"The usage policy for {safetyScore} is {
    safetyScore switch
  {
    > 90 => "Unlimited usage",
    > 80 => "General usage, with daily safety check",
    > 70 => "Issues must be addressed within 1 week",
    > 50 => "Issues must be addressed within 1 day",
    _ => "Issues must be addressed before continued use",
  }
  }";

5. 改进方法组转换为委托 - Method Group conversion to Delegate

委托⽤于将⽅法作为参数传递给其他⽅法。最常见的委托是 Action、Func 和 EventHandler。您可以使⽤ lambda 表达式来提供委托,也可以使⽤⽅法组。您还可以将委托缓存到⼀个字段中,并在需要时重⽤该实例。

例如这个就是我们经常使⽤的定义:

void ActionDelegetDemo(Func<string> action) { }
string GetPlayer() => "";

在 C# 11 之前 我们通过方法组进行委托的调用,如:

ActionDelegetDemo(GetPlayer);
ActionDelegetDemo(new Func<string>(GetPlayer));

在 C# 11 后,你可以通过没有闭包的 Lamda/⽅法中去实现  

ActionDelegetDemo(() => GetPlayer());

也可以通过⼿动委托的⽅式来实现

static readonly Func<string> Instance = new Func<string>(GetPlayer);
ActionDelegetDemo(Instance);

6. 接口中的静态抽象成员 - Static Abstract Members in Interfaces

C# 11 和 .NET 7 包括接⼝中的静态抽象成员。它可定义重载运算符或其他静态成员的接⼝。使⽤静态成员定义接口后,可使⽤这些接⼝作为约束来创建使⽤运算符或其他静态⽅法的泛型类型。通过将 static 和 abstract 修饰符添加到不提供实现的任何静态成员,如:

public interface IGetNext<T> where T : IGetNext<T>
{
static abstract T operator ++(T other);
}

这个功能在泛型处理是⾮常⽅便的,我们可以在接⼝中包含静态抽象成员,然后我们可以对泛型⽅法指定⼀个约束,即类型参数应该从这个特定的接⼝派⽣。⼀旦完成,泛型⽅法就可以轻松调⽤静态⽅法。

Native AOT 来了

如果你是传统的 Xamarin 开发者,你肯定对 AOT 技术不陌生,因为有 Mono AOT,⽽针对客户端场景和服务器场景也有 ReadyToRun。Native AOT 技术可以将 .NET 应⽤程序编译成本机可执⾏⽂件,也还可以⽣成独⽴的动态或静态库从⽽给其他编程语⾔调⽤。Native AOT 应⽤程序启动速度⾮常快,⽽且对于内存的使⽤也是⾮常⼩的。你可以在没有 .NET 运⾏时的设备上直接运⾏ Native AOT 的应⽤。Native AOT 不使用 JIT 编译器,所以它可以在 JIT 受限制的环境中运⾏。它可以在 Arm64 / x64 的环境下运⾏。这个或者让⼤家想到了 Rust,也想到了 Go。现阶段,.NET 7 的 Native AOT ⾮常受限只有控制台和⼀些库文件⽀持。但这是第一步,希望各位⼩伙伴也能尽量去尝试。

如果你要创建⼀个 Native AOT 的应⽤,需要在 csproj ⽂件中添加:

<PropertyGroup>
  <PublishAot>true</PublishAot>
</PropertyGroup>

你也可以针对 Linux 或者 Windows arm/x64 编译 Native AOT 应⽤,例如

dotnet publish -r linux-arm64 -c Release

注意在 Ubuntu 环境下,你需要添加以下的⼀些库 clang zlib1g-dev

sudo apt-get install clang zlib1g-de

现在 Native AOT 还是⽐较受限,我更期待能⽀持⼀下 MAUI,这样是不是路更⼴。还有我使⽤ Native AOT 编译出来的应⽤过⼤,是否需要考虑压缩⼀下呢?我能理解它是增量的,但是⼀个 HelloWorld 应⽤也⼤得有点夸张了。希望它能越来越好。

端技术改进

.NET MAUI 是⼀道坎,或者很多⼩伙伴希望它能做更多。有⼈会希望性能有所提升,有⼈希望能在 Linux 上得到⽀持,也有⼈希望 IDE 能够完善⼀点。我⼀直和 .NET MAUI 的团队保持沟通,也希望尽快能实现各位⼩伙伴的愿望。在 .NET 7 中,.NET MAUI 在桌⾯应⽤的⽀持有了很多的改善。在⼿势,在桌⾯菜单,以及对⿏标⽀持,右键菜单,窗体缩放都有很好的⽀持。或者期望更多了。这不是最好的更新,但是这是更稳定的跨平台应⽤开发。我们在期待更⼤更新的时候,更应该开始着⼿投⼊到 .NET MAUI 的应⽤开发中来了。

 

开发体验上 .NET MAUI 已经⽀持 iOS 16 和 Android 13了,这也解决了 Xcode 14不兼容的问题。与时俱进是我喜欢 .NET MAUI 的原因。还有 Hot Reload 也有了⼀个进化,⽀持 .NET for iOS 和 .NET for Android 以及 Blazor WebAssembly 了。

说完 .NET MAUI , 说到端应⽤不能不提及 Blazor,这⼏年 Blazor 的应⽤持续攀升,这也得益于一个好的性能以及 WebAssembly 技术的发展。我个⼈很喜欢 WebAssembly。.NET 7 为基于 JavaScript 的应⽤中的 WebAssembly 上运⾏ .NET 提供了改进的支持,包括丰富的 JavaScript 互操作机制。.NET 7 中的 WebAssembly ⽀持是基于 Blazor WebAssembly 应⽤程序,但也可以独⽴于 Blazor 使⽤。现有的 JavaScript 应⽤程序可以使⽤ .NET 7 中扩展的 WebAssembly ⽀持来重⽤ JavaScript 中的 .NET 库或构建全新的基于 .NET 的应⽤。Blazor WebAssembly 应⽤程序还可以使⽤新的 JavaScript 互操作机制来优化与 JavaScript 和 Web 平台的交互。

各位⼩伙伴在安装好 .NET 7 后可以在命令⾏中通过 workload 添加 wasm 的⽀持:

dotnet workload install wasm-tools
dotnet workload install wasm-experimental

添加完成后,你就可以通过创建你的 wasm 应用:

dotnet new wasmbrowser

还有也有了 AOT 的⽀持,通过 AOT 你可以提升运⾏速度,通过修改 csproj ⽂件就可以获取 AOT ⽀持

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
               <TargetFramework>net7.0</TargetFramework>
               <WasmMainJSPath>main.js</WasmMainJSPath>
               <OutputType>Exe</OutputType>
               <Nullable>enable</Nullable>
               <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+                <PublishTrimmed>true</PublishTrimmed>
+                <TrimMode>full</TrimMode>
+                <RunAOTCompilation>true</RunAOTCompilation>
     </PropertyGroup>
</Project>

发布也⾮常简单

dotnet publish -c Release

⽽且还⽀持在本地托管发布应⽤

dotnet tool install --global dotnet-serve
dotnet serve --mime .wasm=application/wasm --mime .js=text/javascript --
mime .json=application/json --directory bin\Release\net7.0\browserwasm\
AppBundle\

ML.NET 2.0 发布

⽤ .NET 做机器学习,很多⼈会打⼀个问号。但微软就是要把 .NET 可以做机器学习的问号变成了叹号。ML.NET 在 1.5 后,特别是 ML.NET CLI 已经⾮常好⽤,特别是 AutoML 这块。在 ML.NET 2.0 对于⾃然语⾔这块的处理都有⾮常⼤的改进。这得益于 TorchSharp 的改进,或者是受TensorFlow.NET 的影响,⾃家⽀持的 TorchSharp 也有了很⼤的进步。

⾃然语⾔是⾮常常⻅的问题,ML.NET 新增加了⽂本分类的 API,让开发者通过少量的代码就可以完成⽂本分类,情感分析以及摘要提取等⼯作。具体的 API 封装如下:

你可以理解为 ML.NET 帮你完成了 80% 的⼯作,包括最复杂的⾃然语⾔算法构建等⼯作,你需要做的就是提供数据, 和相关 API 的调⽤。这是官⽅的⼀个示例

using Microsoft.ML;
using Microsoft.ML.TorchSharp;
var mlContext = new MLContext();
var reviews = new[]
{
new {Text = "This is a bad steak", Sentiment = "Negative"},
new {Text = "I really like this restaurant", Sentiment = "Positive"}
};
var reviewsDV = mlContext.Data.LoadFromEnumerable(reviews);
var pipeline =
mlContext.Transforms.Conversion.MapValueToKey("Label",
"Sentiment")
.Append(mlContext.MulticlassClassification.Trainers.TextClassification(num
berOfClasses: 2, sentence1ColumnName: "Text"))
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
// Train the model
var model = pipeline.Fit(reviewsDV);

我们可以看到⾮常简洁,并不需要很多的机器学习/深度学习知识,这也让更多 .NET 开发者能更快使⽤ ML.NET 到项⽬中来。

小结

.NET 7 在 .NET 6 基础上做了加⼀的操作,让 .NET 朝着更好的⾃⼰⼜迈进了⼀步。对于众多 .NET 开发者⽽⾔,我们会继续拥抱 .NET,当然也希望有更多的⼈加⼊到 .NET 的开发⼤家庭中来。.NET 7 并不是终点,每次版本的发布都是⼀个重新的起点。希望 .NET 越来越好。

ps :这次 .NET Conf 2022 不仅有 .NET 7, 官⽹也更新了,更加直观好⽤,⼤家快快上去看看!

相关文档

  • 访问 .NET 中⽂官⽹ 

  • 下载最新的 .NET 7 

  • 了解 C# 11 

  • 了解 F# 6 

  • 了解 .NET MAUI 

  • 了解 .NET 微服务相关内容

  • 了解 .NET Native AOT 技术 

  • 了解 Blazor 

前往官方博客,查看.NET 7发布详情~

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

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

相关文章

如何用python给女神写一封照片情书?亲测表白率100%~

嗨害大家好鸭&#xff01;我是小熊猫❤ 咳咳…大家都问我 是怎么追到我女神的&#xff0c; 斗胆来分享一下俺的小教程&#x1f4a8; 实现步骤 想要实现把情书写在像素中&#xff0c; 那么我们就需要用到pillow这个神器。 众所周知&#xff0c;图片是由无数个像素所组成的&…

【Spring Boot项目】个人在线音乐播放器

文章目录项目简介数据库表的设计拦截器及返回数据格式注册功能登陆功能音乐列表相关业务查询功能上传音乐播放音乐收藏音乐删除功能删除单个音乐批量删除音乐收藏列表查询收藏的音乐取消收藏注销功能项目简介 本项目主要是实现了在线播放音乐的功能&#xff0c;用户可以随时登…

[RCTF 2019]Nextphp

知识点&#xff1b;利用 FFI 绕过 disable_functionFFI 介绍与利用 首先 FFI 肯定要开&#xff0c;且 PHP 版本肯定要早 7.4 以上 简介&#xff1a; FFI &#xff0c;可以让我们直接在PHP脚本中调用C语言写的库中的函数。 FFI 的安全性问题 FFI虽然给了我们很大的灵活性&am…

人脸视频检索系统设计(C++)

目录 人脸检索系统框架的构建 1 一.软件实现的主要界面 1 二.软件的需求概括 1 三.软件代码设计过程中需要注意的问题 2 四.程序到目前为止产生的诸多缺陷 4 五.程序的详细设计过程 4 1.输入部分的设计 4 2.检测结果部分的设计过程 10 人脸检索系统框架的构建 ------FaceMFC_v…

腾讯148道面试题,(程序员必备学习方向)全会拿45Koffer没问题

相信你可能经历过这些&#xff1a; 已经工作两三年了&#xff0c;每个项目都会加班加点全力以赴去完成&#xff0c;薪资增长幅度却不如人意。听说年后离职的老同事&#xff0c;金三刚拿下高薪offer&#xff0c;年薪直奔50万了。由于现在的公司接触不到新技术&#xff0c;对自己…

思科网络部署实验

作者介绍&#xff1a; 作者&#xff1a;小刘在C站 每天分享课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; 夕阳下&#xff0c;是最美的绽放。 今天带个大家一个实验&#xff0c;为网络篇的综合实验&#xff0c;有能力的可以试一试不会的可以私信小刘。 配…

排序算法:插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序、归并排序

排序算法相关总结&#xff0c;涉及的排序算法有&#xff1a;插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序、归并排序&#xff08;动图不是自己画的&#x1f31e;&#xff09;。 目录1.插入排序2.冒泡排序3.选择排序4.希尔排序5.堆排序6.快速排序7.归并排序总结稳…

【Revit二次开发】模型中存储数据——参数和外部存储(Parameter, Schema and Entity)

模型中存储数据参数读取写入外部存储SchemaEntity快速获取外部存储参数参数 在Revit平台API中&#xff0c;每个图元对象都有参数属性&#xff0c;它是隶属于图元所有属性的集合&#xff0c;在此集合中更改属性值。 每个图元的参数都有一个与之关联的ElementId类型的ID大多数参…

KMP算法

文章目录KMP算法KMP算法 KMP算法要解决的问题就是在字符串&#xff08;也叫主串&#xff09;中的模式&#xff08;pattern&#xff09;定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字&#xff08;接下来称它为P&#xff09;&#xff0c;如果它在一个主串&…

C++图的建立---邻接矩阵-----邻接表

目录 图的表示方式 邻接矩阵 邻接表 图的遍历 深度优先遍历 深度优先遍历算法步骤&#xff1a; 图的广度优先遍历 广度优先遍历算法步骤: 图的邻接矩阵存储来创建图 代码 运行结果&#xff1a; 图的邻接表存储来创建图 如下图&#xff1a; 运行结果&#xff1…

认定能源管理体系的条件

能源管理体系认证申请清单&#xff08;GB/T 23331-2012《能源管理体系 要求》国家标准&#xff09;体系运行时间超过6个月 1、营业执照复印件&#xff1b; 2、组织机构代码证&#xff08;适用时&#xff09;&#xff1b; 3、生产许可证和其他行政许可证明复印件、资质证明等…

保卫城市消费券安全,从这些做起

近日&#xff0c;顶象发布的《城市消费券安全调研报告》&#xff08;以下简称《调研报告》&#xff09;中明确提出&#xff0c;自消费券发放之日起&#xff0c;黑灰产便盯上了这块蛋糕。据不完全统计&#xff0c;190多亿的消费券&#xff0c;消费者只抢到29%。 而在百度键入消…

公众号网课答案在线查搭建

公众号网课答案在线查搭建 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#…

操作系统实验三虚拟存储器管理之模拟页面置换算法(FIFOLRU)

文章目录 一、概述 &#xff08;1&#xff09;置换算法 &#xff08;2&#xff09;缺页率与命中率 二、先进先出置换算法&#xff08;FIFO&#xff09; (1)定义 (2)示例 &#xff08;3&#xff09;Belady异常 三、最近最久未使用置换算法&#xff08;LRU&#xff09; &#…

LeetCode每日一题——764. 最大加号标志

LeetCode每日一题系列 题目&#xff1a;764. 最大加号标志 难度&#xff1a;普通 文章目录LeetCode每日一题系列题目示例思路题解题目 在一个 n x n 的矩阵 grid 中&#xff0c;除了在数组 mines 中给出的元素为 0&#xff0c;其他每个元素都为 1。mines[i] [xi, yi]表示 g…

谈谈HTTP协议的方法里,GET和POST的区别?我来教你如何回答~

目录 前言 一、什么是GET、POST&#xff1f; 1.1GET 1.2POST 二、如何轻松回答&#xff1f; 第一步、直接盖棺定论&#xff1a; 第二步、谈细节上的区别&#xff1a; 前言 要想回答好这个问题&#xff0c;咱们先来了解以下什么是GET、POST方法&#xff0c;有哪些细节要注…

阿宇wifi球机如何连接手机

首先下载APP&#xff0c;请见以下三种方式&#xff1a; &#xff08;1&#xff09;至APP Store、各大应用市场搜索 “智U”&#xff0c;下载并安装APP。  &#xff08;2&#xff09;登录ezcloud.uniview.com官网&#xff0c;扫描界面右下方智U APP二维码&#xff0c;下载并…

SpringBoot线上服务假死解决,CPU内存正常

背景 开发小伙伴都知道线上服务挂掉&#xff0c;基本都是因为cpu或者内存不足&#xff0c;出现GC频繁OOM之类的情况。本篇文章区别以上的情况给小伙伴们 带来不一样的服务挂掉。 还记得哔哩哔哩713事故中那场诡计多端的0吗&#xff1f; 对就是这个0&#xff0c;和本次事故没关…

Python基础知识入门(二)

Python基础知识入门&#xff08;一&#xff09; 一、数字类型 Python 数字数据类型用于存储数值。数据类型是不允许改变的&#xff0c;如改变数字数据类型的值&#xff0c;将重新分配内存空间。 1.数字函数 函数 描述 abs(x) 返回数字的绝对值。如abs(-10) 返回 10。 fa…

前端小游戏——推箱子

最近刚刚更新完了HTML&#xff0c;CSS的万字总结&#xff0c;有很多人已经学习完了文章&#xff0c;感觉反馈还不错&#xff0c;今天&#xff0c;用HTML&#xff0c;CSS&#xff0c;JS的知识编写了一个童年经典游戏 - 推箱子&#xff0c;供学习参考。 推荐学习专栏&#xff1a…