.NET社区工具包下载 .NET 社区工具包 .NET Community Toolkit 8.2 官方最新开源版
.NET 社区工具包是一个从 Windows 社区工具包拆解出来的 .NET 开发工具包,内含一组跨平台的帮助程序和 API。该工具包由 Microsoft 维护和发布,是 .NET 基金会的一部分,被多个微软内部项目和应用程序使用,例如 Microsoft Store。
.NET 社区工具包的所有内容最初都是 Windows 社区工具包的一部分,但随着时间的推移,仅针对 .NET 而不特定于 Windows 依赖项的 API 数量不断增加,微软决定将 .NET 相关得内容拆分到一个单独的项目中,知识兔以便它们可以独立发展,.NET Community Toolkit 由此诞生。
由于分支之前的 Windows 社区工具包的最后一个版本是 7.1.x,因此,拆分出来的 .NET 社区工具包从 8.0.0 版本号开始。
8.2新版本包括在运行时和 MVVM Toolkit 源码生成器中的性能改进、新代码修复程序、新的用户请求功能等内容。
包含的组件
CommunityToolkit.Mvvm(又名 MVVM 工具包):一个快速、模块化、平台无关的 MVVM 库,它是 MvvmLight 替代品,广泛用于 Microsoft Store 和其他第一方应用程序。
CommunityToolkit.Mvvm.SourceGenerators:用于扩充 MVVM 工具包的源码生成器。
CommunityToolkit.Diagnostics: 一组辅助 API(特别是 Guard和 ThrowHelper),可用于更简洁、更高效且不易出错的参数验证和错误检查。
CommunityToolkit.HighPerformance用于在高性能场景中工作的助手集合。它包括诸如池化缓冲区助手、快速字符串池Memory
CommunityToolkit.Common:一组与其他 CommunityToolkit 库共享的帮助程序 API。
更新介绍
自定义属性 [ObservableProperty]
对于 MVVM 工具包源代码生成器,知识兔最需要的功能之一(请参阅#208、#217、#228)是支持对[ObservableProperty]使用自定义属性。有几个提议的设计来支持这一点,知识兔最终决定利用 C# 中的现有语法 “ property”: 来让开发人员标记属性以传播到生成的属性。有几个优势:
它利用内置的 C# 语法,使该功能感觉“原生”并且知识兔不需要额外的属性
它解决了注解属性只能针对属性,不能针对字段的问题
也就是说,知识兔使用 MVVM Toolkit 8,现在支持以下场景:
[ ObservableProperty] [ property: JsonPropertyName( “responseName”) ] [ property: JsonRequired] privatestring? _name;
这将在幕后生成以下属性:
[ JsonPropertyName( “responseName”) ] [ JsonRequired] publicstring? Name { get=> _name; set { if(!EqualityComparer< string?>.Default.Equals(_name, value)) { OnPropertyChanging( “Name”); OnNameChanging( value); _name = value; OnPropertyChanged( “Name”); OnNameChanged( value); } } } partialvoidOnNameChanging( string? value) ; partialvoidOnNameChanged( string? value) ;
可以看到生成的属性有知识兔指定的两个属性!这允许完全灵活地为生成的属性添加注释,同时使用内置的 C# 语法并且知识兔对该功能支持的属性类型没有限制。
注意:生成的代码略有不同,知识兔包括此处未显示的其他性能优化。
MVVM 工具包分析器
此版本的 MVVM 工具包也是第一个引入专用分析器的版本。它能够帮助开发人员以最佳方式使用 MVVM 工具包。也就是说,MVVM 工具包将不再只是针对使用错误的功能发出诊断(例如,知识兔以报错的方式),它现在还会显示改进代码和避免常见错误的建 议!
第一个分析器涵盖了使用[ObservableProperty]属性时的一个常见错误。参照这个例子:
[ ObservableProperty] privatestring? name;
[ RelayCommand] publicasyncTask 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] publicpartialclassMyViewModel{[ ObservableProperty] privatestring? name; }
这里,MyViewModel 不是从任何类型继承而来,因此它应该继承 ObservableObject 而不是使用[ObservableObject]属性,知识兔以此改进二进制大小。新的分析器将标记所有与此类似的场景并建议改用继承。这将特别有助于初学者,他们可能不了解两种不同方法的细微差别并且知识兔可能不知道如何选择。在这些情况下,现在分析器可以分享帮助。
MVVM 工具包源代码生成器优化
正如知识兔提到的,这个新版本还包括对 MVVM 工具包的主要性能优化,知识兔以进一步改善开发人员的用户体验,尤其是优化了开发人员在处理非常大的解决方案时的体验。知识兔花了很多时间改进知识兔所有生成器的架构,并与 Roslyn 团队的工程师交谈,知识兔以确保知识兔正在尽可能地发挥它们的性能。
以下只是知识兔在这方面所做的一部分改进:
为 Roslyn 4.3 添加了多目标
(#428 ,#462 ):如果知识兔支持,MVVM 工具包源代码生成器现在将使用 Roslyn 4.3 目标,这样他们就可以在主机支持的情况下选择加入一些更优化的 API。这一功能在引用 MVVM 工具包时会自动启用。
使用 ForAttributeWithMetadataName
(#436 ):知识兔将生成器切换到新的高级 Roslyn API 以匹配属性 ,这大大提高了生成器触发特定属性的性能。比如现在[ObservableProperty]就在用这个。
将诊断移入诊断分析器
(#433 ,#434 ):知识兔将几乎所有诊断都移动到诊断分析器,这些诊断分析器在进程外运行并且知识兔独立于源生成器。这样能够显著减少键入时的overhead,因为所有诊断逻辑现在都在单独的进程中运行,并且知识兔不会降低 IntelliSense 的速度。
停止在增量分享程序中使用符号
( #435 ):知识兔更新了所有增量分享程序以不再传播符号。这可以减少内存使用,因为传播符号会导致 Roslyn 不必要地根编译对象。
更多性能优化 ( #447 、 #460 、 #469 、 #487 、 #489 ):知识兔彻底检查了所有增量模型和增量管道,知识兔以显著提高性能并减少内存分配。
IObservable
另一个功能需求,尤其是由那些在应用程序中大量使用响应式 API 开发人员提出,是寻求一种方法来桥接 MVVM 工具包中的功能。界面的新扩展 IObservable
IObservable < MyMessage> observable = Messenger.CreateObservable < MyMessage> ;
就像这样!此扩展将创建一个对象 IObservable
vartoken = Messenger .CreateObservable
.NET 7和 C# 11支持
.NET Community Toolkit 工具包的新发布版本还将 .NET 7 TFM 添加到高性能包中,新版本中还包括一些变动,主要对新的 C# 11语言功能进行了改善,比如 ref fields 就是一个典型。
以下类型现在不再处于预览状态,知识兔以及更新使用了新的 ref 安全规则:
Ref
ReadOnlyRef
NullableRef
ReadOnlyNullableRef
下面这种场景可以使用这些规则:
publicstaticboolTryGetElementRef( outNullableRef
也就是说,知识兔使用 NullableRef
此外,所有不在预览模式中的 ref struct 类型都已被更新,知识兔使用内部的 ref 字段实现更好的性能。这些类型包括:
Span2D
ReadOnlySpan2D
RefEnumerable
ReadOnlyRefEnumerable
SpanEnumerable
ReadOnlySpanEnumerable
更多新变化可参照官方文档。
下载仅供下载体验和测试学习,不得商用和正当使用。