国漫手机壁纸

Announcing .NET 6 Preview 7

详细英文原文:Announcing.NET6Preview7我们很高兴发布.NET6Preview7。这是我们进入(两个)发布候选(RC)期之前的最后一次预览。 您可以下载适用于Linux、macOS和Windows的 .NET6Preview7 。Instal

NetSmell 出品

  详细英文原文:Announcing .NET 6 Preview 7

  我们很高兴发布 .NET 6 Preview 7。这是我们进入(两个)发布候选 (RC) 期之前的最后一次预览。 您可以下载适用于 Linux、macOS 和 Windows 的 .NET 6 Preview 7 。

  请参阅.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 中解决性能回归问题,并在那时默认启用该功能。

  更多详细内容,请查看更新公告

显示余下内容
相关文章:
  1. 信用卡 PIN 码很容易猜测
  2. 神经元簇发能模拟 AI 学习策略
  3. 蜘蛛丝可能根本不具有抗菌性质
  4. 佳能因禁止无墨水打印机扫描被起诉
  5. DeepMind盈利后开始「买买买」!收购机器人模拟平台MuJoCo,全面开源
  6. 分析师:新MacBook Pro搭载自家芯片,苹果利润率更高了
  7. 格芯提交上市申请IPO,筹资约26亿美元
  8. 美股周二:中概股普涨 阿里涨超6% 高途涨逾12%
  9. 搭配自研处理器与安卓12,谷歌新机Pixel 6起价599美元
  10. 摩根士丹利:马斯克有望凭SpaceX成首位万亿美元富豪
  11. 《鱿鱼游戏》助奈飞三季度新增用户翻倍,股价近新高
  12. DOTA 2又上热搜了 为什么这次大家到处刷“猛犸”?
  13. 多位游戏巨头联合希望美国政府监管盗版和作弊网站
  14. Google Play Data Safety开始接受开发者申请:2022年将强制执行
  15. 价格欺诈投诉引发公益诉讼 京东“划线价”格式条款须整改
 

发表回复

您的电子邮箱地址不会被公开。