Announcing .NET 6 Preview 7
详细英文原文:Announcing.NET6Preview7我们很高兴发布.NET6Preview7。这是我们进入(两个)发布候选(RC)期之前的最后一次预览。 您可以下载适用于Linux、macOS和Windows的 .NET6Preview7 。Instal
详细英文原文:Announcing .NET 6 Preview 7
我们很高兴发布 .NET 6 Preview 7。这是我们进入(两个)发布候选 (RC) 期之前的最后一次预览。 您可以下载适用于 Linux、macOS 和 Windows 的 .NET 6 Preview 7 。
- Installers and binaries
- Container images
- Linux packages
- Release notes
- API diff
- Known issues
- GitHub issue tracker
请参阅.NET MAUI 和 ASP.NET Core ,了解更多详细信息。
.NET 6 Preview 7 已经过测试,并且受 Visual Studio 2022 Preview 3 支持。Visual Studio 2022 使您能够利用为 .NET 6 开发的 Visual Studio 工具,例如在 .NET MAUI 中开发、C# 应用程序的热重载、新的 Web WebForms 的实时预览,以及 IDE 体验中的其他性能改进。 Visual Studio Code 也支持 .NET 6。 Visual Studio Code 的 C# 扩展的最新版本已针对 .NET 6 Preview 7 进行了更新,并且包括对 C# 10 的支持。
查看新的 conversations posts,我们对最新的 .NET 功能进行了深入讨论。 我们还发布了 String Interpolation in C# 10 and .NET 6 和 Preview Features in .NET 6 – Generic Math 的相关帖子。
.NET SDK:现代化的 C# 项目模板
我们更新了 .NET SDK 模板以使用最新的 C# 语言功能和模式。 我们将确保模板在未来使用新的和现代的功能。
新模板中使用了以下语言功能:
- Top-level 语句
- 异步 Main
- 全局 using 指令(通过 SDK 驱动的默认值)
- 文件范围的命名空间
- 目标类型的新表达式
- 可空引用类型
您可能想知道为什么我们通过模板启用某些功能,而不是在项目面向 .NET 6 时默认启用它们。我们同意您需要做一些工作来将应用程序升级到 .NET 的新版本作为权衡用于改进平台的默认行为。 这使我们可以改进产品,而不会随着时间的推移使项目文件复杂化。 但是,该模型的某些功能可能会具有破坏性,例如可为空的引用类型。 我们不想将这些功能与升级体验联系起来,但希望将选择权留给您,无论何时何地。 模板是一个风险低得多的枢轴点,我们可以在那里为新代码设置新的“良好默认模型”,而不会产生几乎那么多的下游后果。 通过项目模板启用这些功能,我们获得了两全其美:新代码从启用这些功能开始,但升级时现有代码不受影响。
控制台模板
控制台模板展示了最大的变化。
// See https://aka.ms/new-console-template for more information Console.WriteLine ("Hello, World!");
The .NET 5 version of the same template includes several lines of familiar ceremony that provide the structure previously necessary for even a single line of actual code.
using System; namespace Company.ConsoleApplication1 { class Program { static void Main (string[] args) { Console.WriteLine ("Hello, World!"); } } }
控制台模板的项目文件也已更改,以启用可为空引用类型功能,如下例所示。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> </PropertyGroup> </Project>
其他模板还支持 nullability, implicit global usings, and file scoped namespaces,包括 ASP.NET Core and Class Library.
ASP.NET web 模板
Web 模板也同样减少了代码行数,使用相同的功能。
var builder = WebApplication.CreateBuilder (args); var app = builder.Build (); if (app.Environment.IsDevelopment ()) { app.UseDeveloperExceptionPage (); } app.MapGet ("/", () => "Hello World!"); app.Run ();
ASP.NET MVC 模板
MVC 模板在结构上是相似的。 在本例中,我们已将 Program.cs 和 Startup.cs 合并到一个文件 (Program.cs) 中,从而进一步简化。
var builder = WebApplication.CreateBuilder (args); // Add services to the container. builder.Services.AddControllersWithViews (); var app = builder.Build (); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment ()) { app.UseDeveloperExceptionPage (); } else { app.UseExceptionHandler ("/Home/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts (); } app.UseHttpsRedirection (); app.UseStaticFiles (); app.UseRouting (); app.UseAuthorization (); app.MapControllerRoute ( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run ();
模板兼容性
有关使用新模板的兼容性问题,请参阅以下文档。
Libraries: Reflection APIs for nullability information
可空引用类型是编写可靠代码的重要特性。 它非常适合编写代码,但不适用于(直到现在)检查它。 新的反射 API 使您能够确定给定方法的参数和返回值的可空性性质。 例如,这些新的 API 对基于反射的工具和序列化程序至关重要。
对于上下文,我们在 .NET 5 中向 .NET 库添加了可为空的注释(并在 .NET 6 中完成),并且正在对本版本的 ASP.NET Core 做同样的事情。 我们还看到开发人员在他们的项目中采用可空性。
可空性信息使用自定义属性保存在元数据中。 原则上,任何人都可以读取自定义属性,但是,这并不理想,因为使用编码很重要。
以下示例演示了将新 API 用于几个不同的场景。
Getting top-level nullability information
private NullabilityInfoContext _nullabilityContext = new NullabilityInfoContext (); private void DeserializePropertyValue (PropertyInfo p, object instance, object? value) { if (value is null) { var nullabilityInfo = _nullabilityContext.Create (p); if (nullabilityInfo.WriteState is not NullabilityState.Nullable) { throw new MySerializerException ($"Property '{p.GetType () .Name}.{p.Name}'' cannot be set to null."); } } p.SetValue (instance, value); }
Getting nested nullability information
class Data { public string?[] ArrayField; public (string?, object) TupleField; } private void Print () { Type type = typeof(Data); FieldInfo arrayField = type.GetField ("ArrayField"); FieldInfo tupleField = type.GetField ("TupleField"); NullabilityInfoContext context = new (); NullabilityInfo arrayInfo = context.Create (arrayField); Console.WriteLine (arrayInfo.ReadState); // NotNull Console.WriteLine (arrayInfo.Element.State); // Nullable NullabilityInfo tupleInfo = context.Create (tupleField); Console.WriteLine (tupleInfo.ReadState); // NotNull Console.WriteLine (tupleInfo.GenericTypeArguments [0].State); // Nullable Console.WriteLine (tupleInfo.GenericTypeArguments [1].State); // NotNull }
System.IO.Compression.ZipFile 类现在在创建和设置文件权限期间捕获 Unix 文件权限,在类 Unix 操作系统上提取 zip 存档。 此更改允许通过 zip 存档来回传送可执行文件,这意味着在解压缩 zip 存档后,您不再需要修改文件权限以使文件可执行。 它还尊重用户、组和其他人的读/写权限。
如果 zip 存档不包含文件权限(因为它是在 Windows 上创建的,或者使用未捕获权限的工具,如 .NET 的早期版本),则提取的文件将获得默认文件权限,就像任何其他文件一样新创建的文件。
Unix 文件权限也适用于其他 zip 存档工具,包括:
Early .NET 7 Feature Preview: Generic Math
对于 .NET 6,我们已经构建了将 API 标记为“预览中”的功能。这种新方法将使我们能够跨多个主要版本提供和发展预览功能。为了使用预览 API,项目需要明确选择使用预览功能。如果您在未明确选择的情况下使用预览功能,您将看到带有可操作消息的构建错误,从 .NET 6 RC1 开始。在以后的版本中,预览功能可能会以破坏性的方式发生变化。这就是他们选择加入的原因。
我们在 .NET 6 中预览的其中一项功能是静态抽象接口成员。这些允许您在接口中定义静态抽象方法(包括运算符)。例如,现在可以实现代数泛型方法。对于某些人来说,此功能将是最出色的改进。它可能是自 Span<T> 以来最重要的新型系统功能。
下面的示例采用 IEnumerable<T> 并且能够对所有值求和,因为 T 被约束为 INumber<T>,可能是 INumber<int>。
public static T Sum<T>(IEnumerable<T> values) where T : INumber<T> { T result = T.Zero; foreach (var value in values) { result += value; } return result; }
提到的所有功能都是 .NET 6 的预览版,不支持在生产中使用。 我们将不胜感激您使用它们的反馈。 我们打算在 .NET 7 中继续发展和改进通用数学功能以及支持它们的运行时和 C# 功能。我们希望对当前体验进行重大更改,这也是新 API 被标记为“的部分原因” 在预览中”。
请参阅我们的博客文章了解更多详情!
Libraries: NativeMemory APIs
我们添加了通过 System.Runtime.InteropServices.NativeMemory 公开的新本机内存分配 API。 这些 API 代表 malloc、free、realloc 和 calloc C API 的等效,还包括用于进行对齐分配的 API。
您可能想知道如何考虑这些 API。 首先,它们是用于低级代码和算法的低级 API。 应用程序开发人员很少会使用这些。 考虑这些 API 的另一种方式类似于平台内在 API,它们是用于芯片指令的低级 .NET API。 这些 API 很相似,但为与内存相关的操作公开了低级 API。
Libraries: System.Text.Json 序列化通知
System.Text.Json 序列化程序现在将通知作为(反)序列化操作的一部分公开,这对于默认值和验证很有用。要使用该功能,需要在 System.Text.Json.Serialization 命名空间内实现一个或多个接口 IJsonOnDeserialized、IJsonOnDeserializing、IJsonOnSerialized 或 IJsonOnSerializing。下面是一个在 JsonSerializer.Serialize () 和 JsonSerializer.Deserialize () 期间验证的示例,以确保 FirstName 属性不为空。
public class Person : IJsonOnDeserialized, IJsonOnSerializing { public string FirstName{ get; set; } void IJsonOnDeserialized.OnDeserialized () => Validate (); // Call after deserialization void IJsonOnSerializing.OnSerializing () => Validate (); // Call before serialization private void Validate () { if (FirstName is null) { throw new InvalidOperationException ("The 'FirstName' property cannot be 'null'."); } } }
Libraries: System.Text.Json serialization property ordering
我们还通过 System.Text.Json.Serialization.JsonPropertyOrderAttribute 添加了控制属性序列化顺序的功能。 一个整数指定顺序。 较小的整数首先被序列化; 没有属性的属性的默认排序值为 0。下面的示例指定 JSON 应按 Id、City、FirstName、LastName 的顺序进行序列化:
public class Person { public string City { get; set; } // No order defined (has the default ordering value of 0) [JsonPropertyOrder (1)] // Serialize after other properties that have default ordering public string FirstName { get; set; } [JsonPropertyOrder (2)] // Serialize after FirstName public string LastName { get; set; } [JsonPropertyOrder (-1)] // Serialize before other properties that have default ordering public int Id { get; set; } }
Runtime: W^X (write xor execute) 支持所有平台和架构
运行时现在有一种模式,它不会同时创建或使用任何可写和可执行的内存页面,所有可执行内存都映射为只读。此功能已在 macOS(适用于 Apple Silicon)上和其它平台启用。此前在 Apple Silicon 机器上,同时可写和可执行的内存映射是被禁止的。
在这些平台上,可执行代码的生成/修改是通过单独的读写内存映射完成的,而这些映射是在与可执行代码地址不同的虚拟内存地址处创建的,并且仅在执行写入时存在很短的时间。例如,JIT 现在将代码生成到暂存缓冲区中,在整个方法被 jitt 之后,使用单个内存复制函数调用将代码复制到可执行内存中。并且可写映射生命周期仅跨越内存复制的时间。
用户可以通过将环境变量 DOTNET_EnableWriteXorExecute 设置为 1 来启用此新功能。此功能目前是可选的,因为它具有启动回归(Apple Silicon 除外)。预计在 .NET 7 中解决性能回归问题,并在那时默认启用该功能。
更多详细内容,请查看更新公告。
相关文章:
- 信用卡 PIN 码很容易猜测
- 神经元簇发能模拟 AI 学习策略
- 蜘蛛丝可能根本不具有抗菌性质
- 佳能因禁止无墨水打印机扫描被起诉
- DeepMind盈利后开始「买买买」!收购机器人模拟平台MuJoCo,全面开源
- 分析师:新MacBook Pro搭载自家芯片,苹果利润率更高了
- 格芯提交上市申请IPO,筹资约26亿美元
- 美股周二:中概股普涨 阿里涨超6% 高途涨逾12%
- 搭配自研处理器与安卓12,谷歌新机Pixel 6起价599美元
- 摩根士丹利:马斯克有望凭SpaceX成首位万亿美元富豪
- 《鱿鱼游戏》助奈飞三季度新增用户翻倍,股价近新高
- DOTA 2又上热搜了 为什么这次大家到处刷“猛犸”?
- 多位游戏巨头联合希望美国政府监管盗版和作弊网站
- Google Play Data Safety开始接受开发者申请:2022年将强制执行
- 价格欺诈投诉引发公益诉讼 京东“划线价”格式条款须整改
发表回复