net工具 入门的

在ReSharper 2021.2中改进了对源生成器的支持

的受欢迎程度源发电机随着越来越多的项目学会利用它们来减少繁琐和重复的开发工作,在。net社区中正在缓慢而稳定地增长。新来者可以在我们的来源生成器介绍博客文章,尝试各种微软提供了样品,或观看谈话录音“实践中的源发生器”JetBrains .NET在线日

源代码生成器是一个非常棒的工具,它允许您在编译时生成代码。例如,您可以使用生成器以相等方法扩展项目中的每个类型,或者基于公共API类型自动提供接口。然而,随着时间的推移,使用生成的代码会变得很麻烦。此外,许多ReSharper特性由于其独特的状态而无法在源生成的文件中使用。

生成的文件不会直接包含在解决方案中,因为它们是在编译时生成的。ReSharper确实允许在临时编辑器视图中查看生成的文件。但是,这些临时文件不能修改,这意味着您不能编辑代码或重构它。此外,如果您正在使用源代码生成的代码,则没有调试器提示。

您可能还会注意到导航特性,例如发现用法去声明并非总是可用的。即使检查源代码生成的代码是否包含编译错误也很困难,因为这些生成的文件不是解决方案范围的分析的一部分。即使在编辑器中打开文件也不会显示任何错误高亮显示,这可能会导致错误在编译发生之前不被注意。

ReSharper 2021.2,源代码生成的文件获得许多人类编写的代码文件所获得的特性。我们添加了镶嵌提示,高亮,导航,以及在源生成的文件中更好的语法高亮显示。调试器现在显示调试器提示,以方便检查代码中发生的情况。生成的代码也由Solution-Wide分析(SWEA),因此生成的代码中的问题会更快地显示出来。重构现在也会触发源生成器并验证更改不会导致项目崩溃。最后,Find usage允许您对生成的资源进行分组

守护进程、导航和调试器

作为ReSharper用户,您会立即注意到使用源代码生成代码的最大问题之一。没有检查,嵌入提示不会显示参数名称和变量类型,导航功能不能用于源代码中的成员。多痛苦啊……好吧,不再痛苦了!

ReSharper 2021.2,您将能够浏览源代码生成的代码,就像您自己编写的一样。所有的常规特征,比如镶嵌的暗示、错误高亮显示、导航、语义标识符着色现在支持源代码生成的代码。

此外,对于源代码生成的代码,现在提供了调试器提示,这在调试会话期间很有帮助。当您进入生成的代码时,您将看到提示,这些提示告诉您有关变量的当前状态和方法调用结果。

在源生成的文件中进行重构

解决方案广泛的分析

解决方案广泛的分析现在完全了解源生成的文件。该分析将检查所有源代码生成的文件以及开发人员编写的文件。此外,ReSharper的分析会立即让你知道你是否做了导致源代码问题的修改。例如,如果您删除了解决方案的源代码生成部分中使用的方法。

在下面的示例中,我意外地创建了两个后台字段,它们应该创建名为的属性标题-来自_jobTitle字段,一个用于新创建的_title字段。解决方案范围的分析将立即在生成的文件中发现问题,让我知道问题以及我的更改是否修复了它。

源代码生成器重构与解决方案广泛的分析

大多数开发人员使用的源代码与手写代码的标准不同。例如,代码冗余和风格偏好在生成的代码中不那么重要,因为我们看重代码的功能而不是它所采用的形式。简而言之,我们只是希望它能成功。ReSharper将识别源代码生成的文件,从而避免了大多数风格选择和代码冗余的困扰,这些都与我们自己的偏好不同。

源代码生成器旨在减少我们编写的代码,但这可能意味着生成器将对我们的代码库产生更大的影响。例如,对一个手写代码文件的更改可能会导致源生成器在每次击键时对数十个文件进行级联更改。代码库中的巨大变化意味着我们的解决方案需要重新分析,以检测潜在的破坏性变化。

此外,极端的文件更改可能表明生成器本身存在问题。如果你曾经遇到过这个问题,或者发现分析生成的文件对你的用例没有必要,你有一个选项来禁用对所有源生成的文件的解决方案广泛的分析,在ReSharper选项中的一个新设置:代码检查|设置|启用解决方案范围的分析|包括源生成的文件

重构

全局重构现在可以从源生成的文件触发。然而,您可能已经注意到,源代码生成的代码是只读并且不能被永久编辑。然而,解决方案中的一个简单更改将触发一个源生成器,撤销对生成代码的任何更改。那么,为什么我们需要对源代码进行重构呢?

让我们看看两个重构有意义的场景。

一次重构生成的和手写的代码

首先,源代码生成的元素通常基于手写代码中的实体。(AutoNotify)由Microsoft提供的生成器示例通过触发来帮助本地开发人员避免样板代码INotifyPropertyChanged事件。在源生成的文件中使用ReSharper,我们可以更新后台字段和生成的属性与一个重构.生成的属性将根据生成的后台字段的名称,使用正确的名称重新创建。这几乎是神奇的,特别是如果你知道所有潜在的错综复杂!

跨解决方案在源生成的文件中重命名

为源生成器安全地更改输入

令人惊讶的是,对非代码文件(如CSV文件、JSON或其他静态资产)生成的代码使用重构可能是有益的。例如,我们有一个源生成器属性,它将静态CSV文件的路径作为输入。更改参数将改变之前生成的代码的上下文,立即使代码库失效。此外,这样的更改可能会引入数百个编译错误,必须手动修复这些错误。

相反,你可以使用a更改签名首先重构到源生成的方法。使用重构将正确地将更改应用到整个解决方案的每个调用站点,然后继续执行生成器的输入更改。这样,即使生成的代码不能更改,我们也可以依靠重构来更新用法并找出每一个可能的问题,例如在更新生成的代码之前确保选择了正确的重载。

更改源生成器的签名和输入

发现用法

我们在这次更新中处理的最后一件事是改进了从源生成文件的搜索结果的集成发现用法窗口。该工具窗口可以将结果分组到许多分组模式中,以帮助您轻松地在解决方案中找到匹配项,默认和最常见的分组是项目结构.项目结构组结果是根据文件、文件夹和项目的位置组织的。

源生成的文件对这种分组提出了一个有趣的挑战,因为它们根本没有直接包含在您的解决方案中;因此,他们在项目结构中没有一个正确的位置。

在2021.2年,我们为源生成的文件引入了一个虚拟项目模型结构。源生成的文件现在被分组到一个名为源生成的文件以便立即让您知道哪些结果来自您自己的代码,哪些结果是生成的。默认模式还通过生成文件的特定生成器对文件夹中的源生成文件进行分组。如果您有多个扩展相同类型的生成器,并且生成具有相似甚至等价名称的文件,那么这可能很有用。

查找源生成文件和分组的用法

结论

源代码生成器无疑将改变许多。net开发人员构建未来应用程序的方式。生成代码可以减少繁琐的任务,这有助于减少常见的复制和粘贴错误。虽然这听起来很神奇,但我们更愿意把它看作是一门先进的科学;一个我们都应该能够理解的强大工具。

使用像ReSharper这样的工具可以让你理解并与你的应用程序的所有部分进行交互,无论是手写的,生成的,还是两种方法的结合。有了ReSharper 2021.2中以源代码生成器为重点的新特性,开发人员将拥有无与伦比的访问生成代码的权限,并对他们的代码库有更全面的解决方案洞察力。我们希望您从这篇文章中学到了一些新东西,并希望它们在您学习更多关于源代码生成器的知识时能对您有所帮助。

为了尝试这些新功能,请下载ReSharper 2021.2.一如既往,我们非常感谢所有的反馈和意见。

发现更多的