宣布推出 .NET 社区工具包 8.1!

我们很高兴地宣布 .NET Community Toolkit 8.1 版正式发布!这个新版本包括呼声很高的新功能、bug 修复和对 MVVM 工具包源代码生成器的大量性能改进,使开发人员在使用它们时的用户体验比以往更好! 

就像在我们之前的版本中一样,我们非常感谢 Microsoft 使用该工具包的团队以及社区中的其他开发人员收到的所有反馈,这些反馈已经并将继续对我们如何设计所有新功能和改进并确定其优先级产生巨大影响。我们非常感谢每一位做出贡献并不断帮助 .NET Community Toolkit 变得更好的人!
 

.NET 社区工具包中有什么?

 

正如我们在之前的公告帖子中所做的那样,让我们首先简要回顾一下 .NET Community Toolkit 包含的内容。它由几个独立的库组成:

  • CommunityToolkit.Common
  • CommunityToolkit.Mvvm (又名“Microsoft MVVM Toolkit”)
  • CommunityToolkit.Diagnostics
  • CommunityToolkit.HighPerformance

这些库还广泛用于 Windows 附带的多个收件箱应用程序,例如 Microsoft Store 和照片应用程序!

有关 .NET Community Toolkit 历史的更多详细信息,请访问我们之前的8.0.0公告帖子的链接。

以下是 .NET Community Toolkit 新 8.1 版中包含的主要更改的部分。

 

自定义属性 [ObservableProperty]

 

正如我们在8.1.0预览版1公告博客文章中提到的,对于 MVVM 工具包源代码生成器,我们最需要的功能之一(请参阅#208、#217、#228)是支持对[ObservableProperty]使用自定义属性。有几个提议的设计来支持这一点,我们最终决定利用 C# 中的现有语法 “property”: 来让开发人员标记属性以传播到生成的属性。有几个优势:

  • 它利用内置的 C# 语法,使该功能感觉“原生”并且不需要额外的属性
  • 它解决了注解属性只能针对属性,不能针对字段的问题

也就是说,使用 MVVM Toolkit 8.1,现在支持以下场景:

[ObservableProperty] 
[property: JsonPropertyName("responseName")] 
[property: JsonRequired] 
private string? _name; 

这将在幕后生成以下属性:

[JsonPropertyName("responseName")] 
[JsonRequired] 
public string? Name 
{ 
    get => _name; 
    set 
    { 
        if (!EqualityComparer<string?>.Default.Equals(_name, value)) 
        { 
            OnPropertyChanging("Name"); 
            OnNameChanging(value); 
 
            _name = value; 
 
            OnPropertyChanged("Name"); 
            OnNameChanged(value); 
        } 
    } 
} 
 
partial void OnNameChanging(string? value); 
partial void OnNameChanged(string? value);

可以看到生成的属性有我们指定的两个属性!这允许完全灵活地为生成的属性添加注释,同时使用内置的 C# 语法并且对该功能支持的属性类型没有限制。

注意:生成的代码略有不同,包括此处未显示的其他性能优化。

您可以在链接找到我们关于新源代码生成器的所有文档。

 

MVVM 工具包分析器

 

此版本的 MVVM 工具包也是第一个引入专用分析器的版本。它能够帮助开发人员以最佳方式使用 MVVM 工具包。也就是说,MVVM 工具包将不再只是针对使用错误的功能发出诊断(例如,以报错的方式),它现在还会显示改进代码和避免常见错误的建议!

第一个分析器涵盖了使用[ObservableProperty]属性时的一个常见错误。参照这个例子:

[ObservableProperty]
private string? name;

[RelayCommand]
public async Task LoadUserAsync()
{
    User user = await _userService.FetchUserAsync();

    name = user.Name; // Whoops! Assigning to the field!
}

开发人员不小心分配给一个字段(而不是生成的属性),然后被卡在 UI 上。UI 上没有显示该更改,也没有明确说明为什么会这样,这一情景已经被多次提出。新的分析器将在这些情况下提供帮助,它将标记支持可观察属性的字段的所有赋值,并显示诊断建议引用生成的属性。你不会再收到莫名其妙的属性丢失的通知。

第二个新分析器旨在帮助减少使用 MVVM 工具包的应用程序中的二进制文件大小。正如我们在8.0.0 公告帖子中提到的,MVVM 工具包包含多个属性(例如[ObservableObject]),这些属性允许生成器将实现 INotifyPropertyChanged 和 INotifyPropertyChanging 接口所需的所有代码(也可选择使用其他帮助程序)注入现有类。

这仅适用于无法继承的情况:如果您不属于这种情况,您应该选择继承 ObservableObject,从而减小的二进制文件大小,因为编译器不必在每个过程中一遍又一遍地复制那些相同的助手类型。请参阅这个例子:

[ObservableObject]
public partial class MyViewModel
{
    [ObservableProperty]
    private string? name;
}

这里,MyViewModel 不是从任何类型继承而来,因此它应该继承 ObservableObject 而不是使用[ObservableObject]属性,以此改进二进制大小。新的分析器将标记所有与此类似的场景并建议改用继承。这将特别有助于初学者,他们可能不了解两种不同方法的细微差别并且可能不知道如何选择。在这些情况下,现在分析器可以提供帮助。

 

MVVM 工具包源代码生成器优化

 

正如我们提到的,这个新版本还包括对 MVVM 工具包的主要性能优化,以进一步改善开发人员的用户体验,尤其是优化了开发人员在处理非常大的解决方案时的体验。我们花了很多时间改进我们所有生成器的架构,并与 Roslyn 团队的工程师交谈,以确保我们正在尽可能地发挥它们的性能。

以下只是我们在这方面所做的一部分改进:

  • 为 Roslyn 4.3 添加了多目标(#428,#462):如果支持,MVVM 工具包源代码生成器现在将使用 Roslyn 4.3 目标,这样他们就可以在主机支持的情况下选择加入一些更优化的 API。这一功能在引用 MVVM 工具包时会自动启用。
  • 使用 ForAttributeWithMetadataName<T>(#436):我们将生成器切换到新的高级 Roslyn API 以匹配属性,这大大提高了生成器触发特定属性的性能。比如现在[ObservableProperty]就在用这个。
  • 将诊断移入诊断分析器(#433,#434):我们将几乎所有诊断都移动到诊断分析器,这些诊断分析器在进程外运行并且独立于源生成器。这样能够显著减少键入时的overhead,因为所有诊断逻辑现在都在单独的进程中运行,并且不会降低 IntelliSense 的速度。
  • 停止在增量提供程序中使用符号( #435 ):我们更新了所有增量提供程序以不再传播符号。这可以减少内存使用,因为传播符号会导致 Roslyn 不必要地根编译对象。
  • 更多性能优化(#447、#460、#469、#487、#489):我们彻底检查了所有增量模型和增量管道,以显著提高性能并减少内存分配。

 

IObservable<T> 信使扩展

 

另一个功能需求,尤其是由那些在应用程序中大量使用响应式 API 开发人员提出,是寻求一种方法来桥接 MVVM 工具包中的功能。界面的新扩展 IObservable<T> extensions 现在支持此功能。它们可以按如下方式使用:

IObservable<MyMessage> observable = Messenger.CreateObservable<MyMessage>();

就像这样!此扩展将创建一个对象 IObservable<T> ,该对象可用于订阅消息并对其做出动态反应。还支持通过单独的重载指定不同的标记。这面这个示例展示了新 API 的端到端使用:

var token = 
    Messenger 
    .CreateObservable<MyMessage>() 
    .Where(...) 
    .Subscribe(m => Console.WriteLine($"Hello {m.Username}!")); 

 

.NET 7和 C# 11支持

 

.NET Community Toolkit 工具包的新发布版本还将 .NET 7 TFM 添加到高性能包中,新版本中还包括一些变动,主要对新的 C# 11语言功能进行了改善,比如 ref fields 就是一个典型。

以下类型现在不再处于预览状态,以及更新使用了新的 ref 安全规则:

  • Ref<T>
  • ReadOnlyRef<T>
  • NullableRef<T>
  • ReadOnlyNullableRef<T>

下面这种场景可以使用这些规则:

public static bool TryGetElementRef(out NullableRef<T> reference) 
{ 
    // Logic here... 
} 

也就是说,使用 NullableRef<T> 类型规则可以有效地让方法具有 out ref T 参数, 而这在 C# 中是无法通过表达式做到的. 我们还计划扩展这些类型的 API 浅层面,从而允许这些类型通过使用 Unsafe 类型,提供一种易于使用的替代 GC-ref 算法的方法,这在视觉上也更类似于传统的指针算法。

此外,所有不在预览模式中的 ref struct 类型都已被更新,使用内部的 ref 字段实现更好的性能。这些类型包括:

  • Span2D<T>
  • ReadOnlySpan2D<T>
  • RefEnumerable<T>
  • ReadOnlyRefEnumerable<T>
  • SpanEnumerable<T>
  • ReadOnlySpanEnumerable<T>

 

其他变化

 

新版本中包含更多内容! 您可以在 GitHub release page 发布页面中查看完整的变更日志。

您可以在 GitHub repo 找到所有的源代码,也能在 MS Learn 上找到一些手写文档, 还能在 .NET API 浏览器网站中找到完整的 API 参考文档。如果您想为新版本的改善贡献自己的力量, 请随时提问题或联系我们,让我们知道您的体验!

如果您想了解有关 MVVM 工具包的更多信息,您还可以观看最近 .NET Conf 2022 中的视频。

新版本中有整套可用的 Toolkit-s 生态系统,其中有大量有用的 API 可用于构建 .NET 应用程序。祝您编码愉快!  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈

STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈&#x1f4cc;相关篇《STM32F1基于STM32CubeMX配置硬件SPI驱动nRF24L01数据收发》 &#x1f3ac;功能演示 &#x1f33f;工程默认配置的是STM32F103VC单片机&#xff0c;其他型号的修改需要修改启动文件startup_st…

python+django+vue图书个性化推荐系统

整个系统是由多个功能模块组合而成的&#xff0c;要将所有的功能模块都一一列举出来&#xff0c;然后进行逐个的功能设计&#xff0c;使得每一个模块都有相对应的功能设计&#xff0c;然后进行系统整体的设计。 本图书个性化推荐系统结构图如图python manage.py runserver 开…

宇宙最强-GPT-4 横空出世:最先进、更安全、更有用

文章目录前言一、准确性提升1.创造力2.视觉输入3.更长的上下文二、相比于ChatGPT有哪些提升1.GPT-4 的高级推理能力超越了 ChatGPT2.GPT-4 在多种测试考试中均优于 ChatGPT。三、研究团队在GPT-4模型都做了哪些改善1.遵循 GPT、GPT-2 和 GPT-3 的研究路径2.我们花了 6 个月的时…

分享10个不错的C语言开源项目

今天跟大家分享10个重量级的C语言开源项目&#xff0c;C语言确实经得住考验&#xff1a; Redis&#xff1a;Redis是一个开源的高性能的键值对数据库。它以C语言编写&#xff0c;具有极高的性能和可靠性。 Nginx&#xff1a;Nginx是一个高性能的HTTP和反向代理服务器&#xff0…

刚工作3天就被裁了....

前言 还有谁&#xff1f;刚上三天班就被公司公司的工作不适合我&#xff0c;叫我先提升一下。 后面我也向公司那边讨要了一个说法&#xff0c;我只能说他们那边的说辞让我有些不服气。 现在之所以把这件事上记录一下&#xff0c;一是记录一下自己的成长轨迹&#xff0c;二是…

改进YOLO系列 | CVPR2023最新Backbone | FasterNet 远超 ShuffleNet、MobileNet、MobileViT 等模型

论文地址:https://export.arxiv.org/pdf/2303.03667v1.pdf 为了设计快速神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,作者观察到FLOPs的这种减少不一定会带来延迟的类似程度的减少。这主要源于每秒低浮点运算(FLOPS)效率低下。并且,如此低的FLOPS主要…

javaSE系列之类与对象

javaSE系列之类与方法什么是类类的定义书写事项什么是实例化this引用this的注意事项对象的初始化构造方法封装的概念访问限定符封装扩展之包static成员static的特性static的初始化代码块注意事项内部类1.实例内部类&#x1f497; &#x1f497; 博客:小怡同学&#x1f497; &am…

【LeetCode】1171. 从链表中删去总和值为零的连续节点、面试题 02.05. 链表求和

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 1171. 从链表中删去总和值为零的连续节点 面试题 02.05. 链表求和 1171. 从链表中删去总和…

【面试题】面试官:如果后端给你 1w 条数据,你如何做展示?

最近一位朋友参加阿b的面试&#xff0c;然后面试官问了她这个问题&#xff0c;我问她咋写的&#xff0c;她一脸淡定的说&#xff1a;“虚拟列表。”大厂面试题分享 面试题库前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面…

tp6实现邮件发送

tp6实现邮件发送 phpMailer 是一个非常强大的 ph p发送邮件类,可以设定发送邮件地址、回复地址、邮件主题、html网页,上传附件,并且使用起来非常方便。 phpMailer 的特点&#xff1a; 1、在邮件中包含多个 TO、CC、BCC 和 REPLY-TO。2、平台应用广泛&#xff0c;支持的 SMTP…

阿里p8测试总监,让我们用这份《测试用例规范》,再也没加班过

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…

ElasticSearch 8 学习笔记总结(六)

文章目录一. ES8 的Java API 环境准备二. ES8 的Java API 索引操作三. ES8 的Java API 文档操作1. 文档的 插入 批量插入 删除等操作2. 文档的查询四、异步客户端操作一. ES8 的Java API 环境准备 ES8 废除了Type的概念。为了适应这种数据结构的改变&#xff0c;ES官方从1.7版…

学习 Python 之 Pygame 开发魂斗罗(十一)

学习 Python 之 Pygame 开发魂斗罗&#xff08;十一&#xff09;继续编写魂斗罗1. 改写主类函数中的代码顺序2. 修改玩家初始化3. 显示玩家生命值4. 设置玩家碰到敌人死亡5. 设置敌人子弹击中玩家6. 修改updatePlayerPosition()函数逻辑继续编写魂斗罗 在上次的博客学习 Pytho…

(四)HDFS双HA高可用机制

目录 概述 原理 主备切换 小结: 概述 进入到了hadoop 2.x的时代&#xff0c;为了保证namenode上的元数据不会丢失&#xff0c;而且是高可用的&#xff0c;出现了双实例HA的机制 原理 集群里启动两个namenode&#xff0c;一个是active状态(主)&#xff0c;一个是standby(备…

HDFS黑名单退役服务器

黑名单&#xff1a;表示在黑名单的主机IP地址不可以&#xff0c;用来存储数据。 企业中&#xff1a;配置黑名单&#xff0c;用来退役服务器。 黑名单配置步骤如下&#xff1a; 1&#xff09;编辑/opt/module/hadoop-3.1.3/etc/hadoop目录下的blacklist文件 添加如下主机名称&…

Spring —— 初学 Spring, 理解控制反转

JavaEE传送门JavaEE Servlet —— Smart Tomcat,以及一些访问出错可能的原因 Servlet —— Servlet API 目录SpringIoC (理解控制反转)传统代码ioc代码DISpring Spring 通常指的是 Spring Farmework (Spring 框架), 它是一个开源框架 用一句话来概括: Spring 是一个包含了众多…

【linux】Linux基本指令(上)

前言&#xff1a; 在之前我们已经简单了介绍了一下【Linux】&#xff0c;包括它的概念&#xff0c;由来啊等进行了讲解&#xff0c;接下来我们就将正式的踏入对其的学习&#xff01;&#xff01;&#xff01; 本文目录&#x1f449;操作系统的概念1.命令的语法1.1命令介绍1.2选…

ChatGPT告诉你:项目管理能干到60岁吗?

早上好&#xff0c;我是老原。这段时间最火的莫过于ChatGPT&#xff0c;从文章创作到论文写作&#xff0c;甚至编程序&#xff0c;简直厉害的不要不要的。本以为过几天热度就自然消退了&#xff0c;结果是愈演愈烈&#xff0c;热度未减……大家也从一开始得玩乐心态&#xff0c…

python flask项目打包成docker镜像发布

1.编写python flask代码&#xff0c;简单写一个加法的接口&#xff0c;命名为sum.py import json from flask import Flask,request,render_template app Flask(__name__)app.route(/) def index():return hello worldapp.route(/sum,methods[POST]) def correct():a request…

C/C++网络编程笔记Socket

https://www.bilibili.com/video/BV11Z4y157RY/?vd_sourced0030c72c95e04a14c5614c1c0e6159b上面链接是B站的博主教程&#xff0c;源代码来自上面视频&#xff0c;侵删&#xff0c;这里只是做笔记&#xff0c;以供复习和分享。上一篇博客我记录了配置环境并且跑通了&#xff0…
最新文章