更快,更强的.NET 7 发布了

bf1012833400b09b051d73ca83839241.png

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

1

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 indentedmore 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);
}

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

2

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 应⽤也⼤得有点夸张了。希望它能越来越好。

3

端技术改进

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

4cea11b27d770a2be9e8f8809db666b9.png

b302c815577cd71c3057a9fe3f87ab75.png

开发体验上 .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\

4

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 封装如下

7e427a21254480739968dbb237a3c987.png

你可以理解为 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 到项⽬中来。

5

小结

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

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

c3a909895fa2ce9c70e3217fa10ba9ba.png

最后希望⼤家记得⽀持我在 11⽉ 10 ⽇ 北京时间下午 13:30-14:00关于.NET做深度学习的课程。

9d4fd59d87572f795c2244c5829849fe.png

相关文档

1. 访问 .NET 中⽂官⽹ 

https://dotnet.microsoft.com/zh-cn/

2.下载最新的 .NET 7 

https://dotnet.microsoft.com/en-us/download/dotnet/7.0

3.了解 C# 11 

https://learn.microsoft.com/dotnet/csharp/whats-new/csharp-11/?

wt.mc_id=ICX_dontnet22

4.了解 F# 6 

https://learn.microsoft.com/zh-cn/dotnet/fsharp/whats-new/fsharp-6?wt.mc_id=ICX_dontnet22

5.了解 .NET MAUI 

https://learn.microsoft.com/zh-cn/dotnet/maui/what-is-maui?

wt.mc_id=ICX_dontnet22

6.了解.NET 微服务相关内容 https://learn.microsoft.com/dotnet/architecture/microservices/?

wt.mc_id=ICX_dontnet22

7.了解 .NET Native AOT 技术 

https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/?

wt.mc_id=ICX_dontnet22

8.了解 Blazor 

https://learn.microsoft.com/zh-cn/aspnet/core/blazor/?wt.mc_id=ICX_dontnet22

CA周记往期回顾:

7e1ad6a3b3d81b7841b1be87e3667170.jpeg

更多原创文章与资源共享

请关注Kinfey Techtalk

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

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

相关文章

jvm(Java virtual machine) JVM架构解释

2019独角兽企业重金招聘Python工程师标准>>> JVM 架构解释 每个Java开发者都知道通过JRE【Java运行环境】执行字节码。 但是很多人都不知道JRE是JVM实现的事实。JVM负责执行字节码的分析 代码的解释和运行。 我们应该了解JVM的架构&#xff0c;这对开发者来说是很重…

WinForm(十五)窗体间通信

在很多WinForm的程序中&#xff0c;会有客户端之间相互通信的需求&#xff0c;或服务端与客户端通信的需求&#xff0c;这时就要用到TCP/IP的功能。在.NET中&#xff0c;主要是通过Socket来完成的&#xff0c;下面的例子是通过一个TcpListerner作为监听&#xff0c;等待TcpClie…

关于Java开发需要注意的十二点流程

1.将一些需要变动的配置写在属性文件中 比如&#xff0c;没有把一些需要并发执行时使用的线程数设置成可在属性文件中配置。那么你的程序无论在DEV环境中&#xff0c;还是TEST环境中&#xff0c;都可以顺畅无阻地运行&#xff0c;但是一旦部署在PROD上&#xff0c;把它作为多线…

Unity经典游戏教程之:雪人兄弟

版权声明&#xff1a; 本文原创发布于博客园"优梦创客"的博客空间&#xff08;网址&#xff1a;http://www.cnblogs.com/raymondking123/&#xff09;以及微信公众号"优梦创客"&#xff08;微信号&#xff1a;unitymaker&#xff09;您可以自由转载&#x…

一款自用的翻译小工具,开源了

一款自用的翻译小工具&#xff0c;开源了TranslationTool作者&#xff1a;WPFDevelopersOrg - 唐宋元明清|驚鏵原文链接&#xff1a;https://github.com/Kybs0/TranslationTool此项目使用WPF MVVM开发。框架使用大于等于.NET461。Visual Studio 2019。最初是支持以下&#xff1…

【ELK集群+MQ】通用部署方案以及快速实现MQ发布订阅服务功能

前言&#xff1a;大概一年多前写过一个部署ELK系列的博客文章&#xff0c;前不久刚好在部署一个ELK的解决方案&#xff0c;我顺便就把一些基础的部分拎出来&#xff0c;再整合成一期文章。大概内容包括&#xff1a;搭建ELK集群&#xff0c;以及写一个简单的MQ服务。如果需要看一…

多语言报表的改动方法

在定义上传RTF模板的时候&#xff0c;会有一个是否可翻译的选项&#xff0c;选择之后。就能够上传xlf文件作为翻译内容。 对于已经存在的多语言类型报表&#xff0c;稍作改动之后再上传&#xff0c;可能会出现下面现象&#xff1a; 进程出现了“未完毕”的提示 想要改动非常eas…

LightOJ - 1027 A Dangerous Maze —— 期望

题目链接&#xff1a;https://vjudge.net/problem/LightOJ-1027 1027 - A Dangerous MazePDF (English)StatisticsForumTime Limit: 2 second(s)Memory Limit: 32 MBYou are in a maze; seeing n doors in front of you in beginning. You can choose any door you like. The p…

MASA MAUI Plugin (六)集成个推,实现本地消息推送[Android] 篇

背景MAUI的出现&#xff0c;赋予了广大.Net开发者开发多平台应用的能力&#xff0c;MAUI 是Xamarin.Forms演变而来&#xff0c;但是相比Xamarin性能更好&#xff0c;可扩展性更强&#xff0c;结构更简单。但是MAUI对于平台相关的实现并不完整。所以MASA团队开展了一个实验性项目…

微软加更.NET7中文手册,都有哪些新亮点?

11月8号发布了.NET7&#xff0c;从底层性能改进&#xff0c;到上层API升级&#xff0c;让.NET7综合性能再度提升&#xff01;同时发布了最新的C#11&#xff0c;也带来了很多小惊喜。如何快捷学习最新的.NET7和C#11&#xff1f;答案只有一个&#xff0c;微软官方中文文档&#x…

.NET Conf China 2022 第一批讲师阵容大揭秘!整个期待了!

目光看过来2022年12月3-4日一场社区性质的国内规模最大的线上线下.NET Conf 2022技术大会即将盛大开幕目前大会正紧锣密鼓地进行中第一批大咖讲师及主题已确定小编迫不及待想和大家分享分享嘉宾很大咖分享内容很硬核戳戳小手期待ing孔令磊维宏股份 首席架构师 十多年数控领域研…

妙用SQL Server聚合函数和子查询迭代求和

先看看下面的表和其中的数据&#xff1a;t_product该表有两个字段&#xff1a;xh和price&#xff0c; 其中xh是主索引字段&#xff0c;现在要得到如下的查询结果&#xff1a;从上面的查询结果可以看出&#xff0c;totalprice字段值的规则是从第1条记录到当前记录的price之和。如…

记一次.NET某工控图片上传CPU爆高分析

一&#xff1a;背景 1.讲故事今天给大家带来一个入门级的 CPU 爆高案例&#xff0c;前段时间有位朋友找到我&#xff0c;说他的程序间歇性的 CPU 爆高&#xff0c;不知道是啥情况&#xff0c;让我帮忙看下&#xff0c;既然找到我&#xff0c;那就用 WinDbg 看一下。二&#xff…

从 WinDbg 角度理解 .NET7 的AOT玩法

一&#xff1a;背景 1.讲故事前几天 B 站上有位朋友让我从高级调试的角度来解读下 .NET7 新出来的 AOT&#xff0c;毕竟这东西是新的&#xff0c;所以这一篇我就简单摸索一下。二&#xff1a;AOT 的几个问题 1. 如何在 .NET7 中开启 AOT 功能在 .NET7 中开启 AOT 非常方便&…

【PPT】适配器模式 和 桥接模式

【PPT】适配器模式 和 桥接模式目录【PPT】适配器模式 和 桥接模式一、PPT 截图1.0、封面和目录1.1、设计模式概述1.2、结构型模式特点1.3、适配器模式1.4、桥接模式二、参考资料及 PPT 获取方法独立观察员 2022 年 11 月 15 日为之前公司准备的分享PPT&#xff0c;后来没用上。…

Flask 【第七篇】Flask中的wtforms使用

一、简单介绍flask中的wtforms WTForms是一个支持多个web框架的form组件&#xff0c;主要用于对用户请求数据进行验证。 安装&#xff1a; pip3 install wtforms 二、简单使用wtforms组件 1、用户登录 具体代码&#xff1a; from flask import Flask,render_template,request,…

为了避免内存攻击,美国国家安全局提倡Rust、C#、Go、Java、Ruby 和 Swift,但将 C 和 C++ 置于一边...

本文翻译自两篇文章&#xff0c;第一篇是对美国国家安全局在“软件内存安全”网络安全信息表的解读&#xff0c;第二篇是普及什么是内存安全&#xff0c;为什么它很重要&#xff1f;第一篇 为了避免内存攻击&#xff0c;美国国家安全局提倡Rust、C#、Go、Java、Ruby 和 Swift&a…

.NET周报【11月第2期 2022-11-15】

国内文章统一的开发平台.NET 7正式发布https://www.cnblogs.com/shanyou/archive/2022/11/09/16871945.html在 2020 年规划的.NET 5功能终于在.NET 7 完成了&#xff0c;为微软和社区一起为多年来将不同的开发产品统一起来的努力加冕&#xff0c;未来只有一个.NET, 回顾.NET 20…

chrome 悬停大图插件_Google Chrome浏览器的悬停卡:我不想要的我最喜欢的新东西

chrome 悬停大图插件If you only have a handful of open tabs in Google Chrome, it’s easy to tell what they are. But as you start to collect more tabs (or make the window smaller), it gets harder. That’s where Hover Cards come in. 如果您在Google Chrome浏览器…

GitHub Codespaces 安装 .NET 7

本文主要介绍如何在 GitHub Codespaces 这个云上 IDE 环境中安装 .NET 7背景GitHub 的 Codespaces 可以让我们随时随地编写代码&#xff0c;一些简单的修改也非常方便快捷。特别是 .NET 7 发布后&#xff0c;一些可以直接升级的小项目只需要更改配置就可以了&#xff0c;我们可…