共计 14571 个字符,预计需要花费 37 分钟才能阅读完成。
咱们很快乐公布 .NET 6 RC(Release Candidate) 2。它是生产环境中反对的两个 ”go live” 候选版本中的第二个。在过来的几个月里,团队始终专一于品质的改良。这个版本中有很多的新个性,但在靠近序幕时咱们才会把他们齐全整合在一起。该团队目前正在验证端到端工作流,以找到设计用意和技术事实尚未齐全匹配的中央。这导致团队里的保护人员不得不批改 bug 来达到这个目标。
咱们从用户那里据说,将生产站点降级到.NET 6 是既 ” 无聊 ”(非事件)又 ” 令人兴奋 ”(显著的性能改良)的。不出意外, 咱们置信 RC2 将持续放弃这种趋势。
您能够下载实用于 Linux、macOS 和 Windows 的 .NET 6 Release Candidate2。
- 安装程序和二进制文件
- 容器镜像
- Linux 包
- 公布阐明
- API diff
- 已知的问题
- GitHub 问题跟踪器
请参阅 .NET MAUI 和 ASP.NET Core 帖子,理解无关客户端和 Web 应用程序场景新增性能的更多详细信息。
.NET 大会是一个收费的,为期三天的虚构开发者流动,用来庆贺.NET 的次要版本。往年,.NET 6 将于 11 月 9 日至 11 日在 .NET 大会上公布。咱们期待您能够记下日期准时收听。Visual Studio 2022 预览版 5 也在明天公布,他们还发表将于 11 月 8 日举办公布流动。您能够在 Visual Studio 博客上浏览所有相干内容。
咱们正处于反对生产新版本的周期的这一乏味局部中。咱们真诚地激励它。如果你须要无关如何解决的领导,能够通过 dotnet@microsoft.com 分割咱们。许多企业曾经开始接触,有些曾经开始生产。咱们还帮忙 Microsoft 团队在 RC 版本上运行。一些 Microsoft 团队曾经在 RC1 上投入生产,咱们期待在 RC2 上有更多帮忙。这包含 .NET 网站。
.NET 6 RC2 曾经通过测试,并失去了 Visual Studio 2022 Preview 5 的反对,也在明天公布。Visual Studio 2022 将反对.NET 6,而 Visual Studio 2019 不反对。同样,MSBuild 17.x 将反对它,而 16.x 不反对。如果你想应用.NET 6,你须要降级到 Visual Studio 2022。
反对 Mac 版本的 Visual Studio 2022 目前与.NET 6 RC2 不兼容。咱们正在解决这个问题。
查看新的对话帖子,就最新的 .NET 性能进行工程师对工程师的深刻探讨。
.NET 6 RC1 帖子侧重于根底性能,其中许多性能要到 .NET 7 能力齐全实现。本文重点介绍 C# 10 和模板的相干改良。它还包含 macOS 和 Windows Arm64 的更新(包含重大更改)。让咱们来看看。
C#10
C# 10 是 .NET 6 版本的重要组成部分。在很大水平上,C# 10 是对现有概念和性能 (如记录和模式) 的进一步演变。它还包含一些个性——全局应用和文件作用域的命名空间——能够帮忙您简化代码并编写更少的样板文件。这些具体的改良是本文前面探讨的模板更改的根底。您能够在.NET 6 的示例中看到本节中应用的示例。我将在.NET 6 的最初一个帖子中增加更多的例子。
Record structs
C# 10 减少了对 Record structs 的反对。这个新个性相似于 C# 9(基于类的)记录,但有一些次要的区别。在大多数状况下,增加 Record structs 是为了完整性,这样构造就能够享受与类雷同的记录劣势。然而,该团队并没有简略地结构化记录,而是决定将构造记录与 ValueTuple 保持一致,就像类记录匹配统一。因为这种设计办法,Record structs 的属性在默认状况下是可变的,而 Record 类属性是不可变的。然而,您能够申明一个只读的 Record structs,它是不可变的,并匹配记录类语义。
在较高的档次上,Record structs 不会取代 Record 类,咱们也不激励将 Record 类迁徙到 Record structs。应用类 vs 构造的领导同样实用于 Record 类和 Record structs。换句话说,在抉择应用 Record 之前,应该在类和构造之间做出抉择。
让咱们看看 Record structs 与 Record 类有何不同
Battery battery = new("CR2032", 0.235, 100);
WriteLine(battery);
while (battery.RemainingCapacityPercentage > 0)
{battery.RemainingCapacityPercentage--;}
WriteLine(battery);
public record struct Battery(string Model, double TotalCapacityAmpHours, int RemainingCapacityPercentage);
这个 Record structs 的示例产生如下后果
Battery {Model = CR2032, TotalCapacityAmpHours = 0.235, RemainingCapacityPercentage = 100}
Battery {Model = CR2032, TotalCapacityAmpHours = 0.235, RemainingCapacityPercentage = 0}
如前所述,最显著的区别是记录构造属性在默认状况下是可变的。这是除了构造体和记录构造体语法之外的次要区别。我还用一个只读记录构造重写了这个示例,如下所示。
Battery battery = new("CR2032", 0.235, 100);
WriteLine(battery);
while (battery.RemainingCapacityPercentage > 0)
{Battery updatedBattery = battery with {RemainingCapacityPercentage = battery.RemainingCapacityPercentage - 1};
battery = updatedBattery;
}
WriteLine(battery);
public readonly record struct Battery(string Model, double TotalCapacityAmpHours, int RemainingCapacityPercentage);
您将看到它简直与我为 C# 9 公布的(类)Record 示例雷同。
让咱们回顾一下 C# 9 的记录。它们提供了一种简洁的语法为定义相似构造的面向数据的类。他们偏差于不变性,同时提供简洁的语法——带有表达式——为了不可变敌对的复制。人们可能会诧异于咱们开始应用类来实现相似构造的性能。大多数时候,开发人员应用类而不是构造,这是因为援用传递而不是值语义。在大多数状况下,类是最好的抉择,而且易于应用。
构造记录与类记录十分类似:
- 它们应用雷同的语法(除了定义中的 struct 或 class)。
- 它们容许自定义成员定义(在 C#10 中新增)以在(默认状况下)属性成员上应用字段。
- 它们容许应用 init 或可变属性定制成员行为。
- 它们反对表达式。事实上,从 C# 10 开始,所有的构造类型都反对表达式。
构造记录不同于类记录:
- Record structs 能够用 Record structs 或只读 Record structs 来定义。
- 记录类是用记录或记录类定义的。
- 默认状况下,Record structs 属性是可变的(get/set)。
- 默认状况下,记录类属性是不可变的(get/init)。
Record structs 和 Record 类之间的非对称 (不) 可变性行为可能会让一些读者感到诧异,甚至讨厌。我会试着解释设计背地的想法。因为通过值传递语义,构造从不变性中取得的益处简直不如类。例如,如果构造体是字典中的键,则该 (构造体的正本) 键是不可变的,只能将通过相等执行查找。与此同时,设计团队认为 ValueTuple 能够被视为一个匿名的记录构造,而 Record structs 能够被视为 ValueTuple 的衍生。只有当记录构造蕴含可变性和反对字段时,这才无效,这正是团队决定要做的。另外,蕴含可变性反映了构造和类的不同。
如果您更喜爱记录构造的不可变行为,您能够通过增加 readonly 关键字来取得它。
Looking at structs generally, key functionality is common:
- 运行时提供的等同性查看对所有构造都是雷同的。
- 所有的构造都能够和表达式一起用来创立非变异的正本,这是 C# 10 中的新性能。
Global usings
global using 使您能够指定一个你想要在所有源文件中可用的命名空间,就像在每个源文件中都申明了它一样。它也能够用于应用动态和别名一起应用。该个性容许应用一组通用的 using 申明,并扩大为不再须要的更多的 using 行。这与命名名称空间最为相干,但能够用于任何命名空间。
以下语法可用于各种应用模式:
- global using System;
- global using static System.Console;
- global using E = System.Environment;
这些申明只须要在编译中申明一次就能够了。有四种模式申明 global using。
- 在 Program.cs 中,通过将根 using 语句降级为 global using 来使它们对整个程序具备全局性。
- 在 globaluses .cs 文件 (或相似的名称) 中,集中管理所有的 global using 语句。
- 在我的项目文件中,应用上面的语法。
- 在你的我的项目文件中,应用语句 (对于你的利用所依赖的 MSBuild SDK) 启用默认平台,语法如下。
上面的 MSBuild 语法能够在 (应用与后面示例相似的办法) 中代替.cs 文件。
- < Using Include=”System”/ >
- < Using Include=”System.Console” Static=”True”/ >
- < Using Include=”System.Environment” Alias=”E”/ >
您能够在 < PropertyGroup > 中启用由平台定义的隐式 using 语句。
- < ImplicitUsings > enable < /ImplicitUsings >
隐式应用不同的 MSBuild SDK。Microsoft.NET.Sdk 定义了一个根本集,其余 sdk 定义附加集。
如果应用 MSBuild 性能,您能够在 obj 目录中生成的文件中看到无效的后果,如下所示。
PS C:\Users\rich\app> type .\app.csproj | findstr Using
<ImplicitUsings>enable</ImplicitUsings>
<Using Include="System.Console" Static="True"/>
<Using Include="System.Environment" Alias="E"/>
PS C:\Users\rich\app> type .\obj\Debug\net6.0\app.GlobalUsings.g.cs
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.NET.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;
global using E = global::System.Environment;
global using static global::System.Console;
您能够看到,Microsoft.NET.Sdk 在. globalusings .g.cs 文件中增加了几个 global using 语句。请留神,全局的:: 操作符不是必须的,为了了解生成的语法,能够释怀地疏忽它。
文件与命名空间申明
文件作用域命名空间的申明是 C# 10 的另一个个性,旨在缩小缩进和行数。
此性能的语法如下:
namespaceFoo;
它是传统三行语法的代替计划:
namespaceFoo
{
}
三行语法能够嵌套。单行语法不反对嵌套。每个文件只能有一个文件作用域的申明。它必须在文件中定义的所有类型之前,很像三行语法。
命名空间与顶级语句不兼容。顶级语句存在于顶级命名空间中。这还意味着,如果您向 Program 类增加额定的办法,应用 partial 类语法,则 partial Program 类也须要位于顶级命名空间中。
这个个性十分相似于增加到 C# 8 中的单行 using 申明。
Const 和内插字符串
当初您能够将内插字符串调配给 const 变量。插值字符串应用和读取都很直观,在任何中央都可用。当初,它们能够与 const 一起应用,前提是占位符值也是常量。
以下示例演示了一个可能应用的例子:
const string Bar = "Bar";
const string DoubleBar = $"{Bar}_{Bar}";
WriteLine(DoubleBar);
字符串插值进行了许多其余改良,在 C# 10 和 .NET 6 中的字符串插值中进行了形容。
扩大属性模式
你当初能够在属性模式中援用嵌套属性或字段。例如,上面的模式当初是非法的:
{Prop1.Prop2: pattern}
以前,你须要应用更具体的模式:
{Prop1:{Prop2: pattern}}
您能够在上面的示例中看到应用这种更紧凑的模式,例如应用 Reading.PM25。
List<Status> statuses = new()
{new(Category.Normal, new(20, false, 20)),
new(Category.Warning, new(20, false, 60)),
new(Category.Danger, new(20, true, 60)),
new(Category.Danger, new(100, false, 20))
};
foreach (Status status in statuses)
{
string message = status switch
{{Category: Category.Normal} => "Let the good times roll",
{Category: Category.Warning, Reading.PM25: >50 and <100} => "Check the air filters",
{Reading.PM25: >200} => "There must be a fire somewhere. Don't go outside.",
{Reading.SmokeDetected: true} => "We have a fire!",
{Category: Category.Danger} => "Something is badly wrong",
_ => "Unknown status"
};
Console.WriteLine(message);
}
record struct Reading(int Temperature, bool SmokeDetected, int PM25);
record struct Status(Category Category, Reading Reading);
enum Category
{
Normal,
Warning,
Danger
}
.NET SDK:现代化的 C# 我的项目模板
咱们在 Preview 7 中更新了.NET SDK 模板,应用了最新的 C# 个性和模式。对这些更改有重要反馈,局部起因是构建开始失败。作为初始模板更新的一部分,咱们默认为.NET6(NET 6.0)我的项目 (包含从.NET 5 更新到.NET 6 的应用程序) 启用了隐式应用 (又名 opt-out)。那曾经扭转了。咱们曾经更新了 SDK,所以所有的新性能都是可选的。对这个变动(在 RC1 中做出的) 的响应是踊跃的。
也有反馈说,有些人不喜爱新的简化的 Program.cs 文件,其中有顶级语句。咱们对顶级语句进行了改良,并持续将其用于模板。咱们心愿大多数喜爱传统办法的开发人员能够间接本人增加额定的形式。
新模板中应用了以下语言个性:
- 异步 Main
- 顶级语句
- Target-typed 新表达式
- global using 指令
- 文件作用域命名空间
- 可空援用类型
咱们构建了所有这些性能,因为咱们认为它们比之前的代替计划更好。模板是疏导新开发人员和新应用程序应用最佳模式的最简略和最好的办法。C# 设计团队深信应用更少的行数、更少的字符来指定给定的概念或操作,并缩小不必要的反复。这就是大多数这些新性能所反对的。Nullable 的不同之处在于它产生更牢靠的代码。每个应用 nullable 的应用程序或库都不太可能在生产中解体。软件太简单了,人类无奈像编译器那样看到谬误。
这些性能的一个独特主题是,当您在代码编辑器中查看代码时,它们会缩小烦扰并减少提醒。当初,更加重要的方面会弹出。例如,如果您在给定的文件中看到 using 语句,那么它是隐式集之外须要的非凡语句。你应该可能复制 / 粘贴代码从一个文件到另一个不须要 CTRL-. 类型以增加所需的名称空间(至多没有那么多)。如果您看到可空的正告或谬误,您就晓得您的代码可能在某些方面是不正确的。去除缩进还有益处。更多的代码将在编辑器的前十几个列中可见,而不是仅仅用空格字符填充这些列。人们能够把这些特色看作是在向大脑传递信息的过程中,向眼睛传递更高密度的特异性和意义。
控制台模板
让咱们从控制台模板开始。这是十分小的。
Program.cs:
// 查看 https://aka.ms/new-console-template 失去更多信息
Console.WriteLine("Hello, World!");
Project 文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
只管控制台模板比它的.NET 5 对应的模板要小得多,但在性能上并没有缩小。您还能够看到 ImplicitUsings 当初是一个可抉择的个性,并且在模板中启用了它。
Web 模板
web 模板也是很小的。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
webapi 模板更靠近于典型的 ASP.NET Core 应用程序。您会很快留神到 Program.cs 和 Startup.cs 之间的拆散已被删除。不再须要 Startup.cs。
Program.cs:
var builder = WebApplication.CreateBuilder(args);
// 增加 services to the container.
builder.Services.AddControllers();
// 学习更多对于 configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{app.UseSwagger();
app.UseSwaggerUI();}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
webapi 模板的我的项目文件与控制台相似。
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.1.5" />
</ItemGroup>
</Project>
您能够在本示例中看到文件作用域命名空间被应用,包含在 WeatherForecast.cs 中:
namespace webapi;
public class WeatherForecast
{public DateTime Date { get; set;}
public int TemperatureC {get; set;}
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary {get; set;}
}
指标类型 new 与 WeatherForecastController.cs 一起应用:
private static readonly string[] Summaries = new[]
{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};
在 mvc 模板中,你能够看到可空注解和表达式体办法的应用。
namespace webmvc.Models;
public class ErrorViewModel
{public string? RequestId { get; set;}
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
}
Windows Forms 模板
Windows Forms 模板也失去了更新。它包含了其余模板所波及的大多数其余改良,只管不是顶级语句。
namespace winforms;
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
您能够看到应用了单行命名空间语句,而因为启用了隐式应用,因而没有任何平台级 using 语句。
WPF 模板尚未作为版本的一部分进行更新。
隐式应用
当初我将向您展现这些个性的理论利用。让咱们从隐式用法开始。当启用时,每个 Sdk 都会增加本人的一组隐式 using 语句。
如前所述,Microsoft.NET.Sdk 增加了几个 global using 语句。
如果禁用该个性,您将看到应用程序不再编译,因为不再申明 System 命名空间(在本例中)。
PS C:Usersrichapp> type .app.csproj | findstr Implicit
<ImplicitUsings>disable</ImplicitUsings>
PS C:Usersrichapp> dotnet build
Microsoft (R) Build Engine version 17.0.0-preview-21501-01+bbcce1dff for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
All projects are up-to-date for restore.
You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
C:UsersrichappProgram.cs(2,1): error CS0103: The name 'Console' does not exist in the current context [C:Usersrichappapp.csproj]
Build FAILED.
另一种抉择是应用 global using 个性,它容许您只应用您想要的名称空间,如上面的示例所示。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>disable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Using Include="System" />
</ItemGroup>
</Project>
当初,构建代码。
PS C:Usersrichapp> type .app.csproj | findstr Using
<ImplicitUsings>disable</ImplicitUsings>
<Using Include="System" />
PS C:Usersrichapp> dotnet build
Microsoft (R) Build Engine version 17.0.0-preview-21501-01+bbcce1dff for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
All projects are up-to-date for restore.
You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
app -> C:UsersrichappbinDebugnet6.0app.dll
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:00:00.80
这不是举荐的通用模式,但对于想要最大水平管制的人来说是一个不错的抉择。在大多数状况下,咱们预计开发人员将依赖于 SDK 提供的隐式应用,并从他们本人的代码或广泛应用的 NuGet 包中利用命名空间的显式 global using。
可空性
我曾经更新了 Program.cs, 用来演示可空的援用类型。应用程序调用 List< T > 办法,返回一个 T?,在本例中是一个可空字符串(string?)
List<string> greetings = new()
{"Nice day, eh?"};
string? hello = greetings.Find(x => x.EndsWith("!"));
string greeting = hello ?? "Hello world!";
Console.WriteLine($"There are {greeting.Length} characters in"{greeting}"");
定义 hello 变量的行如果没有定义为 var, string? 或者 List< T >.Find 返回 null,那么就不可能被编译。如果没有启用 nullable 个性,我可能会错过这个问题,这将导致我的代码因 NullReferenceException 异样而解体。那就不好了。我在下一行应用?? 和空合并运算符。在大多数状况下,这两行代码会合并为一行,如上面的代码所示。思考到返回可空援用类型的 API, 我将它们离开(在这个人为的示例中),以便您能够看到我应用的 string?
string greeting = greetings.Find(x =\> x.EndsWith("!"))??"Hello world!";
在本例中,我将所有内容合并到一行中。我当初能够将变量申明为字符串,因为 null 曾经适应了?? 前面的字符串。字符串? 在这种状况下,只有编译器能力看到。
string[] args
当初,我将疾速解决大多数人对顶级语句 (包含 args 参数) 提出的问题。args 参数在顶级语句中依然可用。只是不那么显著。上面是另一个演示如何应用它的程序。
string greeting = args.Length > 0 ? string.Join("", args) :"Hello World!";
WriteLine($"There are {greeting.Length} characters in"{greeting}"in this {nameof(Program)}.");
它产生以下后果。
PS C:\Users\rich\app> dotnet run
There are 12 characters in "Hello World!" in this Program.
PS C:\Users\rich\app> dotnet run Nice day, eh?
There are 13 characters in "Nice day, eh?" in this Program.
这个应用程序还演示了 Program 类型依然是被定义的。Program.Main 不是。
通过增加一个全局动态 using 到我的我的项目文件,我从 Program.cs 中的 Console.WriteLine 中删除了 Console,如下所示。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Using Include="System.Console" Static="True"/>
</ItemGroup>
</Project>
定义惯例办法
咱们曾经听到一些用户的反馈,他们认为真正的办法优于部分函数,特地是对于 Program 类。您能够应用任何一个带有顶级语句的模型。
我放弃程序不变,但将所有性能切换到 Program 类中的静态方法,在局部类中定义。
Program.cs.
WriteLine(GetTheGreeting(args));
Program.Foo.cs.
public partial class Program
{public static string GetTheGreeting(string[] args)
{string greeting = args.Length > 0 ? string.Join("", args) :"Hello World!";
return $"There are {greeting.Length} characters in"{greeting}"in this {nameof(Program)}.";
}
}
它产生与后面示例雷同的后果。Program.Foo.cs 文件名是任意的。事实上,Program.cs 也是如此。你能够给这些文件起任何你喜爱的名字。编译器会找出他们。
如前所述,在应用顶级语句时,Program 类型必须在顶级命名空间中。
macOS and Windows Arm64 更新
咱们除了有好消息,也有一些突破性的变动要分享。反对 macOS 和 Windows arm64 的我的项目曾经根本实现。在 macOS 和 Windows 团队的帮忙下,咱们曾经在这下面工作了一年多。起初,咱们认为该我的项目只是为了在 macOS 上反对 Arm64,而 Rosetta 2 将涵盖 x64。很简略,就像 ISAs,对吧?不齐全是。随着咱们深入研究,咱们发现 x64 + Arm64 共存是一个更大的工作,次要集中在 CLI 和安装程序上,包含一些他们须要达成统一的中央。借助 RC2,咱们正在交付 .NET 的构建版本,以提供咱们能够设想的最佳体验。
我将疾速总结一下咱们在 macOS 和 Windows Arm64 machines 的过程:
- .NET 6 RC2 通过将 Arm64 和 x64 版本装置到不同地位来实现 Arm64 + x64 共存。到目前为止,Arm64 和 x64 构建互相笼罩,which led to general sadness。
- 您须要卸载所有 .NET 版本并从头开始(在 macOS 和 Windows Arm64 机器上)以采纳 .NET 6 RC2+。这包含 Arm64 和 x64、.NET 6 和 .NET 6 之前的版本。
- .NET 6 之前的版本尚未筹备好装置。
- CLI 容许您应用 Arm64 SDK 进行 Arm64 和 x64 开发(假如您曾经装置了所需的 Arm64 和 x64 运行时)。反过来也是一样。
- 咱们心愿人们只应用 Arm64 SDK,因为它会有更好的体验(本机架构性能; 只有一个 SDK 须要保护)。咱们将持续改良产品,使这一模式成为大多数开发者的简略抉择。
- 对于 SDK,咱们只在 Arm64 上反对.NET 6+。晚期的 SDK 构建将在 Arm64 上被阻止。
- 对于运行时,咱们将反对所有反对的版本,Arm64 和 x64。
- .NET 6 RC2 为 Arm64(包含 x64 仿真)提供了大量的.NET 6 最终体验。
- 咱们心愿更新.NET Core 3.1 和.NET 5 运行时,以与.NET 6 RTM 保持一致(在工夫上和技术上)。这还待定。
- RC2 的夜间构建目前是坏的,所以您须要再等几周,直到咱们真正公布 RC2 来尝试所有这些。
- 针对 Windows Arm64 的.NET 5 SDK 将会随着.NET 6 RTM 而提前退出反对。
咱们也在思考对 dotnet test 做一些突破性的扭转,以对立咱们用于架构指标的观点:
- [[Breaking change] For dotnet test, switch -a to alias –arch instead of –test-adapter-path](https://github.com/dotnet/sdk…)
- [[Breaking change] For dotnet test, switch -r to alias –runtime instead of –results-dir](https://github.com/dotnet/sdk…)
该项目标很大一部分是通过 Arm64 SDK 启用 x64 运行时。您能够在下图中看到这一点。
如果你想理解更多细节,请查看 dotnet/sdk #21686。
总结
C# 10 基于 C# 9 的相似个性,在简略性和可表白性方面提供了显著的改良。过来,人们能够正当地讥笑 C#,因为仅仅编写一行代码就须要这么多的礼节和面向对象概念的常识。那些日子曾经过来了,模板反映了这一点。这些变动的局部动机是让 C#对新程序员和学校更有吸引力。这些简化的扭转从根本上扭转了您开始学习和纯熟应用 C# 所须要的货色。在新的默认模式下,它能够间接与其余相似地以繁多文件源文件开始的语言相比拟。
咱们期待看到其余我的项目通过顶级语句、全局应用、记录和许多其余古代个性来简化他们的新用户体验。有很多机会能够为开源我的项目和商业产品创立更简略的学习旅程。
咱们激励您应用 .NET 6 RC2。咱们置信您会发现它是一个牢靠的版本。并将 寰球.NET Conf 的日期会在 11 月 9 日,以便 .NET 6 公布。
感谢您成为 .NET 开发人员。