咱们很快乐公布 .NET 6 RC(Release Candidate) 2。它是生产环境中反对的两个“go live”候选版本中的第二个。在过来的几个月里,团队始终专一于品质的改良。这个版本中有很多的新个性,但在靠近序幕时咱们才会把他们齐全整合在一起。该团队目前正在验证端到端工作流,以找到设计用意和技术事实尚未齐全匹配的中央。这导致团队里的保护人员不得不批改bug来达到这个目标。
咱们从用户那里据说,将生产站点降级到.NET 6是既“无聊”(非事件)又“令人兴奋”(显著的性能改良)的。不出意外,咱们置信RC2将持续放弃这种趋势。
您能够下载实用于 Linux、macOS 和 Windows 的 .NET 6 Release Candidate 2。
安装程序和二进制文件
容器镜像
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的另一个个性,旨在缩小缩进和行数。
此性能的语法如下:
namespace Foo;
它是传统三行语法的代替计划:
namespace Foo{}
三行语法能够嵌套。单行语法不反对嵌套。每个文件只能有一个文件作用域的申明。它必须在文件中定义的所有类型之前,很像三行语法。
命名空间与顶级语句不兼容。顶级语句存在于顶级命名空间中。这还意味着,如果您向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/swashbucklebuilder.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 buildMicrosoft (R) Build Engine version 17.0.0-preview-21501-01+bbcce1dff for .NETCopyright (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-previewC: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 buildMicrosoft (R) Build Engine version 17.0.0-preview-21501-01+bbcce1dff for .NETCopyright (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.dllBuild 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 runThere 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 6RC2。咱们置信您会发现它是一个牢靠的版本。并将 寰球.NET Conf 的日期会在 11 月 9 日,以便 .NET 6 公布。
感谢您成为 .NET 开发人员。