[No0000B2]ReSharper操作指南3/16-配置ReSharper与代码校错
配置ReSharper
ReSharper功能具有默认配置,这些配置基于.NET世界中的约定和最佳实践。但是,每个功能都可以根据您的需求和喜好灵活调整。
ReSharper首选项可以在以下位置进行配置:
-
您可以在"选项"对话框(ReSharper|Options)中查看和编辑主要首选项集。
-
某些特定于项目的属性(例如目标C#版本)是在VisualStudio的"属性"窗口中的ReSharper属性组下配置。
使用分层设置机制保存了主要的ReSharper选项集,这样可以让您针对不同的解决方案拥有不同的首选项,并通过将所需设置子集保留在VCS下与您的团队分享首选项。配置ReSharper时,了解分层设置机制的工作方式非常重要。因此,强烈建议您在对ReSharper设置进行任何重大更改之前研究管理和共享ReSharper设置主题。
配置ReSharper首选项的主要集合
- 在VisualStudio菜单中,选择ReSharper|Options。
- 在出现的选项对话框中,选择左窗格中的一个节点并在右窗格中配置设置。
使用左上角的搜索框来查找特定首选项。 -
单击保存以应用修改,并让ReSharper选择保存它们的位置,或使用保存到下拉列表将修改保存到特定设置图层。有关更多信息,请参阅管理和共享resharper设置。
有关配置特定ReSharper功能的详细信息将在与这些功能相关的部分进行介绍,例如:配置代码检查设置。在本节中,您将学习如何使用ReSharper分层设置以及如何配置一般ReSharper首选项:
指定许可证信息
开箱即用,ReSharper功能具有默认配置,这些配置基于.NET世界中的约定和最佳实践。但是,每个功能都可以根据您的需求和喜好灵活调整。
ReSharper首选项可以在以下位置进行配置:许可证信息对话框中的Pause/ResumeEvaluation按钮。在评估期间,您将能够看到剩下多少天。
许可证信息
如果您决定在评估期过后使用产品,则需要在ReSharper网站上获得许可证,并通过以下方式之一指定许可证信息:
您可以在"许可证信息"对话框或"关于"对话框中检查许可证的状态。
-
所有JerBrains产品的个人和商业许可证都可以通过JetBrains帐户进行管理,JetBrains帐户可用作指定许可信息的方式。
-
所有个人和商业许可证都可以使用许可证密钥指定。
-
对于公司客户,ReSharper允许通过JetBrains许可证服务器存储和分发许可证票据。该服务器允许企业建立有限或无限数量的产品许可证并在企业网络内分发。这种方法的好处是,只要用户关闭应用程序,他们的许可证就会自动返回到服务器,并可供其他用户使用。
指定您的许可证信息
-
在主菜单中,选择ReSharper|Help|LicenseInformation。
-
在打开的"许可证信息"对话框中,使用复选框指定一个或多个许可选项(如果您有多种以不同方式许可的JetBrains.NET产品,则可能需要多个选项):
-
使用JB账户UseJBAccount-如果您将ReSharper许可证绑定到您的JetBrains账户,请选择此选项。
要指定您的帐户,请单击添加帐户,然后在出现的对话框中输入您的帐户凭据并单击登录。成功登录后,ReSharper将显示可用许可证。如有必要,您可以清除您不想使用的许可证旁边的复选框。
请注意,您在指定JetBrains帐户凭证时应连接到Internet。成功登录后,不需要Internet连接。 -
使用许可证密钥UseLicenseKeys-如果您拥有ReSharper的许可证密钥,请选择此选项。
要指定您的许可证密钥,请单击添加许可证密钥,然后在出现的对话框中输入您的用户名和许可证密钥,然后单击添加。如果许可证有效,您将看到相应的消息。 -
使用许可证服务器UseLicenseServer-如果您的公司使用JetBrains许可证服务器分发许可证,请选择此选项。
如果许可证服务器位于本地网络中,则ReSharper通常会检测到此服务器。如果未自动检测到服务器,请单击添加许可证服务器,然后在出现的对话框中指定服务器URL并单击添加。如果服务器上有ReSharper许可证,您将看到相应的消息。 -
只要通过任何许可选项获得有效的产品许可证,产品旁边都会显示一个绿色的选中标记,其中包含许可证的详细信息。
-
单击关闭以应用选定的许可选项并关闭对话框。
JetBrains许可证服务器的许可证
如果您正在使用JetBrains许可证服务器,则可以获得两种类型的许可证。默认情况下,服务器为您发出浮动票据,只要您连接到服务器,票据就会持续存在。如果您需要离线工作,您可以获得永久许可证。
下表介绍了这两种许可证票据之间的区别。
许可证
细节
优点
缺点
浮动许可证(默认)
在启动时,ReSharper在本地网络中查找许可证服务器并请求一张票据,该票据在ReSharper关闭时返回给服务器并可供其他用户使用。票证的获取和返回都是自动完成的。
许可证服务器上的许可证数量可能少于ReSharper用户的数量。例如,如果有60位工程师使用ReSharper,但最多只有50位可同时使用ReSharper,那么许可证服务器上的50个许可证就足够了。
启动ReSharper需要通过本地网络或VPN连接到许可证服务器。
永久许可证
一旦获得,永久票保留在客户机上。在从客户端返回之前,其他用户无法使用它。这两种获取和返回的票手动客户端或许可证服务器管理员来完成。
客户端不需要网络连接来运行ReSharper。
即使客户端不使用永久票证,其他用户仍然无法使用该许可证。
从许可证服务器获取永久许可证
-
在"许可证信息"对话框中,检查当前是否使用许可证服务器的浮动许可证(应该将其写入产品许可证详细信息中)。
-
单击许可证服务器选项旁边的请求永久。
-
在打开的获取永久许可证对话框中,指定您的电子邮件地址并单击发送请求。
-
检查您的收件箱,并使用激活码从许可证服务器中查找消息。
-
在激活密钥文本框中,输入收到的激活密钥,然后单击激活许可证。
-
点击关闭。请注意,如果您的许可证服务器分发有限数量的许可证,则在您归还之前,您持有的许可证凭单仍然对其他用户不可用。
释放永久许可证
-
在主菜单中,选择ReSharper|Help|ReturnPermanentLicense.返回永久许可证。在确认对话框打开后,点击是。
-
在主菜单中,选择ReSharper|Help|LicenseInformation许可证信息。在打开的许可证信息对话框中,单击发布永久许可证。
管理和共享ReSharper设置
ReSharper使用分层设置的机制保存您的首选项,它提供了以下好处:
-
您可以在不同的解决方案中有不同的设置
-
您可以将偏好的不同子集保留在不同的地方,并在处理特定解决方案时将它们合并。例如,您可以将符号图标的个人偏好和团队偏好设置为不同设置文件中的代码格式,并自动组合这些偏好设置。
-
您可以通过在VCS下保留特定的设置子集来同步您的团队中的偏好设置。ReSharper提供了将团队偏好设置保存在单独文件中的默认选项,该文件保存在解决方案文件夹中,可以轻松添加到VCS中。如果其他团队成员使用ReSharper,则只要从VCS提取更改,该文件的设置就会自动应用-不需要重新启动VisualStudio或重新加载解决方案。
-
由于任何设置的子集都可以保存在文件中并进行动态更新,因此您可以通过许多其他方式共享您的ReSharper首选项。例如,您可以将您的个人偏好保存在Dropbox中,并在不同的机器上使用它们。
-
来自不同设置文件的首选项会作为图层应用,因此如果相同设置在不同设置文件中具有不同值,则将使用"上"图层中的值。这使您可以覆盖在特定设置文件中定义的设置,而不是在此文件中更改它们。
考虑下面的例子:
假设您更喜欢使用BSD样式括号,并在您的个人设置中保留此格式首选项。但是,接下来你开始研究一个特定的解决方案,在这个解决方案中,一个约定使用GNU样式括号--ReSharper允许你改变相应的格式设置,并将其保存在一个特定于解决方案的设置层中,这样它就可以覆盖你的个人偏好,并且只要你在这个解决方案上工作。当您打开另一个解决方案时,您将再次应用您的个人偏好。默认设置和设置图层
还有一些首选项可以分别为每个项目配置。
开箱即用,ReSharper提供了默认的首选项设置,这些设置基于.NET世界中的约定和最佳实践。这些默认设置在产品中是硬编码的,如有必要,您可以随时重置为默认设置。如果更改了任何设置,则更改将保存在设置图层中,并且ReSharper会将其应用覆盖相应的默认设置。最初,ReSharper提出了三个层次,您可以在其中保存您的偏好:此计算机,Solutionteam-shared和Solutionpersonal。
'这台电脑'层
此设置图层是为您的个人全局设置指定的,并适用于本地计算机上的所有解决方案。
相应的设置文件保存为:%AppData%\JetBrains\Shared\vAny\GlobalSettingsStorage.DotSettings'解决方案团队共享'层
此图层用于执行当前解决方案的团队偏好设置的常用设置,例如命名样式,格式设置规则等。此图层中的设置将覆盖此计算机图层中的设置。
相应的设置文件<SolutionName>.sln.DotSettings保存在解决方案文件夹中。
只要将此文件添加到您的VCS并且团队成员获得该文件,它们将自动应用此文件中的设置,而无需重新加载解决方案。'解决个人'层
此图层允许您覆盖团队共享设置而不更改它们。如果您需要仅在此解决方案中应用某些设置并且独立于您的团队,则可能会发现这很有帮助。
相应的设置文件<SolutionName>.sln.DotSettings.user保存在解决方案文件夹中。您不应将其添加到您的VCS。考虑下面的插图。您可以看到,最初所有设置图层都是空的,因此ReSharper可以"看穿它们"并应用默认设置:
事实上,最初设置层文件不存在,它们是在您修改并保存某些设置后首先创建的。但是如果存在设置文件,对于其中没有定义的所有设置,它仍然是"透明的"。
保存并覆盖设置
每次在选项对话框中更改某些设置时,对话框底部都会显示一条未保存设置数量的消息。
-
要应用更改,您应该使用其中一个按钮保存它们:
保存(智能保存)
这适用于'智能保存'逻辑。
使用它来保存您的修改并保持团队共享和/或自定义图层(如果有)完好无损。换句话说,如果您只是想保存更改而不打扰设置图层,请使用保存。
保存会将您的更改保存到"此计算机"设置图层,然后-如果"解决方案团队共享"和/或自定义图层中的修改设置有其他值,则更改也会保存到"解决方案个人"图层覆盖其他图层中的值。考虑下图中的例子。假设你改变了三个设置并且具有"绿色"而不是"蓝色"值;这些更改保存在"这台计算机"层。然后,您的团队决定在您的团队共享解决方案中设置A和C'黄色',因此这些值由"解决方案团队共享"层中的团队负责人保存,ReSharper在您拉出时立即应用它们来自VCS的更改。最后,您意识到您对设置A的"绿色"值感到更加舒适,并且您再次进行了更改并将其保存,这次它也保存在"解决方案个人"层中,
您还可以保存每个项目的任何ReSharper首选项,有关更多信息,请参阅JetBrains.NETToolsBlog:每个项目设置或如何为我的测试项目使用不同的命名样式
保存到(保存到特定图层)
不幸的是,在当前实现中,无法看到在"选项"对话框中看到的设置值在哪个层中定义。
您需要使用这些命令将修改后的设置保存到"Solutionteam-shared"图层或自定义图层。如果出于某种目的需要,也可以将修改保存到任何其他图层。
将设置保存到特定图层的唯一方法是,如果在堆栈图层中的上面其他图层中的任何位置使用另一个值定义了相同的设置,则不能应用该设置。下面的插图显示了我们如何尝试将"此计算机"图层中的设置C更改为"红色",以及为什么产生的设置无法更改。
管理设置图层
默认情况下,您可以使用"解决方案团队共享"层共享每个解决方案的ReSharper设置-您需要做的唯一事情就是将*.dotSettings文件置于版本控制之下。
如果您想以其他方式共享设置,则需要了解如何创建新的设置图层,如何导入和导出它们。为了达到这些目的,ReSharper提供了VisualStudio菜单(ReSharper|ManageOptions)中提供的SettingsLayers对话框,并在Options对话框中(通过单击Manage按钮)。自定义设置图层添加到现有默认图层下。例如,如果您希望自定义图层的设置应用于所有解决方案,请将其添加到"此计算机"图层下;否则根据您是否希望它覆盖团队共享设置,将其添加到某个特定于解决方案的层之下。
一旦添加了自定义设置图层,它就会显示在"选项"对话框的"保存到"选择器中,使用它可以将修改后的设置保存到自定义图层。您也可以通过编辑此图层来修改此图层中的设置。
添加自定义设置图层
-
在"设置图层"对话框中,选择要在其下添加图层的默认图层之一。
-
执行以下操作之一:
-
单击添加图层,然后单击创建设置文件创建一个新的空白设置图层或打开设置文件,以从文件系统或任何URI包含现有的设置图层。
-
右键单击并在"添加图层"选择器中选择相应的命令之一。
-
根据所选命令,为新的设置图层文件指定名称和位置,或者选择一个扩展名为.DotSettings的现有设置图层文件。
-
添加图层的设置将根据其在图层堆叠中的位置应用,您可以在"设置图层"对话框中看到该图层的位置,即,如果在上层中定义了某些设置,则上层图层的值将用于结果设置中。如有必要,可以使用上移和下移按钮重新排列组中的自定义设置图层,这些按钮在选择图层时可用。
作为使用"选项"对话框中的"保存到"按钮将修改后的设置保存到特定图层的替代方法,您可以打开特定设置图层进行编辑。
编辑特定的设置图层
-
在"设置图层"对话框中,选择要编辑的设置图层。
-
执行以下操作之一:
-
点击编辑图层。
-
右键单击并在上下文菜单中选择编辑。
-
双击所需的图层。
-
"选项"对话框打开,图层名称及其位置显示在对话框的顶部:
请注意,您在此模式下看到的设置值取自默认值或编辑图层中定义的值。如果未在编辑图层中定义设置,将显示默认设置的值(例如,下图中的"设置B"的值)。
-
-
根据需要编辑图层中的设置,然后单击保存以保存更改。
您可以将任何设置图层的特定设置子集导出到新设置文件。然后可以在ReSharper的另一个实例上使用此文件来应用这些设置。
将设置图层的设置导出到文件
-
在"设置图层"对话框中,选择要从中导出设置的设置图层。
-
执行以下操作之一:
-
在工具栏上,单击"导入/导出",然后单击"导出到文件"。
-
右键单击图层并在上下文菜单中选择"导出到文件"。
-
在打开的"导出到文件"对话框中,指定要导出的设置组,然后单击"确定",然后指定设置图层文件的名称和位置。
作为添加自定义设置图层的替代方法,您可以将此自定义图层的一部分设置复制到现有默认或自定义图层之一。
将设置从设置图层文件导入设置图层
-
在"设置图层"对话框中,选择要导入设置的设置图层。
-
执行以下操作之一:
-
在工具栏上,单击导入/导出设置。根据要导入的文件的位置,单击从文件导入或从URL导入。
-
右键单击图层。点击从导入在上下文菜单,然后单击从文件导入或导入从URL。
-
指定要导入的文件的位置。请注意,如果您选择从URL导入,则应以UNC格式指定文件的路径。
-
在打开的从文件导入对话框中,指定要导入的设置组,然后单击确定。
ReSharper还允许您将设置的一个子集从一个安装的设置层复制到另一个。
将设置从一个图层复制到另一个图层
-
在"设置图层"对话框中,选择要从中复制设置的设置图层。
-
执行以下操作之一:
-
在工具栏上,单击复制设置到,然后选择目标设置图层。
-
右键单击图层,在上下文菜单中选择复制设置至,然后选择目标设置图层。
-
在打开的"复制到"对话框中,指定要复制的设置组,然后单击"确定"。
如有必要,您可以清除保存在特定图层中的所有设置。为此,请右键单击该图层并在上下文菜单中单击重置。
此外,您可以重置所有预定义图层中的所有设置,并卸载所有自定义设置图层,从而将所有设置恢复为默认值。为此,请单击工具栏上的重置所有设置。
请注意,当您重置对话框中的所有设置或删除设置图层时,图层文件不会从磁盘中移除,因此您可以稍后根据需要安装该文件。
您还可以通过清除自定义设置图层旁边的复选框来暂时禁用自定义设置图层,或者通过右键单击并从上下文菜单中选择删除来卸载特定的自定义设置图层。
将设置升级到更新的版本
有时,较新版本的ReSharper可能会对设置的存储格式进行修改。在这种情况下,受影响的设置文件将在新版本的第一次启动时自动升级--ReSharper只是将具有修改格式的设置添加到设置文件中。它还增加了一个条目,说明升级的内容以防止进一步升级。例如:
<s:Booleanx:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/[migration_ID]/@EntryIndexedValue">True</s:Boolean>
但是,即使升级了设置文件,它仍然可以与较早的ReSharper版本一起使用(例如,如果您与未升级的团队成员共享此文件),因为不推荐使用的设置不会被更改或删除。除此之外,这意味着您可以将自动升级的.dotSettings文件中的更改安全地提交给您的VCS。
这里需要注意的是,当您在更新后返回到旧版本时,请使用此旧版本更改一些设置,然后返回到较新版本-ReSharper不会再次升级设置。因此,您更改的某些设置可能会以旧格式保存,而不会由较新版本读取。
因此,如果您(或您的团队)同时使用两个不同版本的ReSharper,则可能需要检查在一个版本中修改的首选项是否在另一个版本中正确读取,如果不是,请在另一个版本中再次进行相同的修改版。
配置项目特定的属性
ReSharper|Edit|Editprojectitemproperties
ReSharper_EditProjectItemProperties主要的一套ReSharper首选项(在ReSharper|Options对话框中配置)可以全局应用,也可以应用于每个解决方案。还有一些首选项可以分别为每个项目配置。这些首选项在"项目项目属性"弹出窗口中提供,您可以通过在解决方案资源管理器中从项目的上下文菜单中选择Editprojectitemproperties来调用该窗口。
您还可以保存每个项目的任何ReSharper首选项,有关更多信息,请参阅JetBrains.NETToolsBlog:每个项目设置或如何为我的测试项目使用不同的命名样式
与其他ReSharper设置类似,项目特定的属性可以保存在两个文件中:[ProjectName].csproj.DotSettings(用于通用首选项,如C#版本)和[ProjectName].csproj.DotSettings.user(用于个人首选项,如本地路径映射)。如有必要,您可以通过将[ProjectName].csproj.DotSettings文件放在源代码管理下与您的团队分享共同首选项。
当您从UI中编辑项目特定设置时,它们将保存在[ProjectName].csproj.DotSettings文件中。项目
描述
其他程序集引用Additionalassemblyreferences
如果您的项目以自定义方式引用某些程序集,则ReSharper可能无法找到它们,因此无法正确分析此项目。
使用此分号分隔列表让ReSharper知道这些程序集所在的位置,以便它能正确解析这些程序集中的符号。其他编译项目Additionalcompileitems
如果您的项目以自定义方式包含文件,ReSharper可能无法找到它们,因此无法正确分析此项目。
使用这个以分号分隔的列表让ReSharper知道这些文件的位置,以便它能够正确解决它们。C#/VB语言级别
使用此选择器选择语言版本。该默认值意味着ReSharper的自动检测根据项目设置的语言版本。根据选定的语言版本,ReSharper的代码检查会检测代码问题并提出与所选版本相关的改进建议。
强制调用MsBuild
使用此选项可通过MsBuild检索模块引用。例如,如果存在COMAPI引用,并且项目在较旧的VisualStudio版本中打开,而没有Roslyn支持,则这可能会有所帮助。
自定义pageParseFilterType处理
该属性仅适用于Web项目。
使用此选择器可以选择ReSharper如何处理Web.config中pages元素pageParseFilterType属性的无法识别的值。本地化Localizable
此首选项定义是否执行本地化检查。如果选择了默认值,则只有在项目中至少有一个资源文件时才会执行检查。"是"和"否"值允许明确启用/禁用此检查。
可本地化的检查员Localizableinspector
此首选项定义ReSharper用来检测可本地化字符串的算法;OptimisticorPessimistic乐观或悲观。如果选择Pessimistic算法,ReSharper将在所有元素中查找可本地化的字符串,除了那些具有属性的元素Localizable(false)。如果选择了乐观算法,则ReSharper只分析具有属性的元素Localizable(true)。根据这些设置,ReSharper定义特定字符串是否可本地化,突出显示可本地化的字符串并启用相应的快速修复。
路径映射Pathmapping
该属性仅适用于Web项目。
使用此首选项,可以将应用程序设计期间文件的位置与应用程序部署的位置同步。有关更多信息,请参阅路径映射。全面解决方案Solution-WideInspections
此首选项定义是否应在项目中启用解决方案范围代码检查。将OnandOff明确此项检查。Internalsymbolsonly内部码元仅值部分地使该检查对类型和类型成员的内部访问。
请注意,此首选项仅适用于启用了解决方案范围分析。使用Roslyn获取项目参考UseRoslyntoobtainprojectreferences
从VisualStudio2015开始,ReSharper通过Roslyn检索项目引用。如果某些引用未正确解析,则可以禁用此首选项,以便通过COMAPI检索引用。
管理扩展
扩展添加额外的功能,如额外的上下文操作,代码分析,对编程语言的支持等。为了简化安装,更新和卸载不同扩展的过程,ReSharper提供了一个管理器,可以自动为您执行所有烦人的日常操作。您可以浏览所有可用的扩展并只需点击一下即可安装。
安装扩展
- 在主菜单中,选择ReSharper|ExtensionManager扩展管理器。
- 在打开的扩展管理器对话框中,查看可用的扩展。
-
单击要添加的扩展名旁边的安装,然后单击对话框底部的安装。
您不仅可以从我们的画廊获得扩展程序,还可以在任何地方找到个人或公司范围的扩展程序。只要添加新的源代码,就可以从源代码安装扩展,无论是本地还是远程都没有区别。因此,如果您的公司已开发一套扩展程序,则需要公开分发它们。
将源添加到软件包源列表
- 打开Environment|ExtensionManager页面。
- 点击添加。
- 在出现的"添加软件包源"对话框中,为新源和本地或远程文件系统路径或自定义NuGet源指定一个显示名称。
- 点击OK将新项目添加到包源代码列表中。
-
单击保存以应用修改,并让ReSharper选择保存它们的位置,或使用保存到下拉列表将修改保存到特定设置图层。有关更多信息,请参阅管理和共享resharper设置。
您已经知道如何使用ExtensionManager,现在是时候自己说说扩展了。有不同种类的扩展。其中一些扩大了ReSharper功能的集合,其他包括一组代码片段和/或SSR模式。
让我们拿ReSpeller。这是一个非常好的扩展,可以帮助您识别拼写错误。如果检测到错字,它将被突出显示,并提示您选择正确的操作。
另一个有用的扩展是xUnit.net测试支持。如果您对xUnit.net测试感兴趣,并希望找到一个简单的方法来运行它们,那么这个扩展程序绝对适合您。
加快编写代码的另一个机会是安装助记符实时模板扩展。你输入一个缩写,按下Tab,相应的模板立即展开。所有可用的缩写都列在模板浏览器窗口中。
正如你可以很容易猜到的那样,除了上述三种扩展之外还有更多的扩展,并且它们的数量不断增长。看看我们的画廊,并给他们一个尝试。
更改图标集
ReSharper提供了几个图标集以匹配VisualStudio的颜色主题。默认情况下,根据所选VisualStudio主题自动选择图标集。但是,您可以为任何主题选择特定的设置。
ReSharper附带的图标在逻辑上可以分为两组:符号图标和应用程序图标。
帮助您识别代码符号种类的所有图标,以便您可以轻松区分方法和属性,属于符号图标集。几个修饰符也用图标表示并包含在这些集合中。您可以在SymbolIconsSchemes主题中找到完整的图标列表。
显示在编辑器中或窗口中工具栏上的其他图标属于应用程序图标集。他们通知您ReSharper提供的不同机会,例如重构或快速修复。
要更改图标集
- 打开Environment|General页面。
- 使用源代码符号图标主题Sourcecodesymboliconstheme和应用程序图标主题Applicationiconstheme选择器来指定所需的图标主题。为了简化选择,在每个项目附近显示相应组中的几个图标
-
单击保存以应用修改,并让ReSharper选择保存它们的位置,或使用保存到下拉列表将修改保存到特定设置图层。有关更多信息,请参阅管理和共享resharper设置。
VisualStudio颜色主题与ReSharper图标集相结合,可以根据个人喜好自定义IDE。尝试不同的选项,您可以找到更适合您的组合,并将其设置为默认组合。考虑下面的例子:
配置缓存
为了确保可接受的速度,ReSharper缓存了分析解决方案时获得的项目模型。缓存数据分别存储在每个解决方案中。因此,当您第一次打开新解决方案时,分析可能需要一些时间,但随后您打开该解决方案时,ReSharper只会读取缓存数据,这通常会很快发生。
根据您的系统配置,您可能更喜欢不同的位置来存储缓存文件。缓存的位置
指定缓存的位置
-
打开Environment|General页面。
-
使用保存解决方案缓存来选择缓存文件的位置:
-
用户本地设置文件夹Userlocalsettingsfolder将它们存储在以下目录中:%LOCALAPPDATA%\JetBrains\ReSharper\v[ReSharper版本]\SolutionCaches
-
系统TEMP文件夹SystemTEMPfolder将它们存储在以下目录中:%TEMP%\ReSharperCache
-
解决方案文件夹Solutionfolder将它们存储在当前解决方案的根文件夹中
-
自定义文件夹Customfolder为ReSharper缓存文件选择自定义位置。
-
单击保存以应用修改,并让ReSharper选择保存它们的位置,或使用保存到下拉列表将修改保存到特定设置图层。有关更多信息,请参阅管理和共享resharper设置。
-
重新打开您的解决方案以使更改生效。
如果您的解决方案处于版本控制之下,或者您打算将其放在那里,最好选择系统TEMP文件夹或用户本地设置文件夹。它允许您从解决方案文件夹中排除缓存,并将它们与源代码分开保存,以免错误地将它们提交到存储库。
请注意,某些实用程序可能会清除系统临时文件夹,并且如果将它们存储在那里,则可能会删除所有缓存。
清理缓存
破碎的缓存会影响ReSharper的行为。例如,ReSharper可以停止解析符号或某些导航命令可能不可用。如果您注意到这种奇怪的行为,则在大多数情况下清除当前解决方案的缓存可能会有帮助。
清除当前解决方案的缓存
-
在VisualStudio中打开解决方案,假定有破碎的缓存。
-
打开Environment|General页面。
-
重新打开您的解决方案以使更改生效。
如果特定解决方案未超过30天,ReSharper会自动清理解决方案缓存。
配置字体和颜色
在VisualStudio选项对话框中,可以配置颜色和ReSharper的将用突出字体支持的语言的语法,通过代码检查发现代码问题,正则表达式的语法,匹配的分隔符,待办项目中,项目模板编辑器。
配置颜色和字体
- 在主菜单中,选择工具|选项Tools|Options。
- 展开左窗格中的环境节点。
- 选择字体和颜色FontsandColors选项卡。
-
在显示项目中,向下滚动列表,直到找到以开头的项目ReSharper。探索列表以查看或编辑ReSharper项目的格式和突出显示。
看下面的例子:
请注意,关键字,方法,字段,构造函数,字符串文字等默认配置了不同的颜色。配置键盘快捷键
所有ReSharper操作都可以通过键盘快捷键调用。大部分操作都具有默认快捷方式,您可以直接使用这些快捷方式。对于其余的操作,您可以根据需要分配首选的快捷键。
ReSharper提供了两种默认的键盘快捷键方案。
-
VisualStudio该方案旨在最大限度地减少与VisualStudio自己的键盘快捷方式的冲突。
-
ReSharper2.x/IntelliJIDEA此方案与IntelliJIDEA及其衍生Web开发IDE中使用的快捷方式共享大部分快捷方式。它在所有JetBrains开发环境中提供了一种通用的键盘为中心的体验。
无论您选择哪种方案,您都可以随时更改个别键盘快捷方式。
更改快捷方式和快捷方式
在安装ReSharper后第一次启动VisualStudio时,将打开"KeyboardScheme"对话框,您可以在其中选择默认快捷方式。
当您更改之前选择的方案时,先前方案设置的密钥绑定不会被取消。要删除旧的密钥绑定和/或恢复由IntelliJIDEA方案覆盖的VisualStudio密钥绑定,请打开VisualStudio选项(工具|选项),转到环境|键盘Environment|Keyboard&Menus并点击重置。
您可以稍后使用Environment|Keyboard&Menus页面。
无论目前选择的方案如何,您始终可以配置单个键盘快捷键。
配置各个键盘快捷键
-
在主菜单中,选择工具|选项Tools|Options。
-
展开环境节点,然后单击键盘。
-
使用快捷表来查找要为其分配新快捷方式的命令的别名。
如果某些命令没有默认快捷方式,则可以在相应帮助页面的标题下找到它的别名。例如,将方法转换为索引器重构。
-
要查找所需的命令,您还可以执行以下操作之一:
-
在显示命令包含字段中键入您正在查找的命令的名称或部分名称。可用命令的列表缩小了,您可以轻松找到所需的命令。
-
查看可用命令列表,向下滚动到以开头的命令名称ReSharper。
一旦键盘选项卡中的命令列表获得焦点,请按Ctrl+r跳转至具有初始值的项目r。 -
如果存在任何快捷方式,则所选命令Shortcutsforselectedcommands的快捷键组合将显示在选定命令的快捷方式下拉列表中。
-
您可以删除现有的组合键和/或添加新的组合键。
-
在快捷方式选择的命令下拉列表中选择组合,然后单击删除。
-
相同的快捷键组合可用于不同的区域,因此您应指定区域。使用下拉列表中的使用新快捷方式指定区域。然后将脱字符号放入Pressshortcutkeys快捷键文本框并按下所需的组合键。点击Assign分配。
-
点击确定。
解决键盘快捷方式冲突
默认快捷方式中使用了一些键盘快捷方式,尤其是在ReSharper2.x/IntelliJIDEA方案中,可能已经映射到其他VisualStudio命令。在这些情况下,ReSharper不会默默取代现有的VisualStudio键盘快捷键。只要您使用冲突的快捷方式(即VisualStudio和ReSharper都使用该快捷方式),系统会提示您使用"ReSharper快捷方式冲突"对话框来解决此冲突:
选择三个可用选项之一:
-
使用ReSharper命令:将冲突的快捷方式绑定到ReSharper命令。
-
使用VisualStudio命令:解决有利于VisualStudio命令的冲突。
-
配置ReSharper命令:打开VisualStudio选项对话框中的"键盘"选项卡,以帮助您自定义当前的键盘方案。
无论您选择什么选项,您都可以通过选择应用于所有ReSharper快捷方式将您的选择应用于所有其他冲突的ReSharper快捷方式。
代码分析
ReSharper可帮助您分析各种级别的代码,从编辑器中的单个语句开始,直至整个解决方案的体系结构。
查找代码问题
ReSharper通过在C#,VB.NET,XAML,XML,ASP.NET,ASP.NETMVC,Razor,JavaScript,TypeScript,HTML,CSS,ResX等应用程序中提供超过2500次代码检查来提供静态代码分析(也称为代码检查)并编译脚本代码,检测编译器和运行时错误,在编译之前建议更正和改进。
默认情况下,只要在编辑器中打开代码文件,ReSharper就会开始分析代码文件,直到它被关闭。通过将所有代码检查连续应用于您的代码,此设计时检查将以无提示方式进行。ReSharper不仅在编辑器中根据其严重程度正确突出显示代码问题,还会在编辑器窗口的右侧添加自己的标记栏,您可以在其中立即查看文件的状态并跳转到特定的代码问题,并提供在代码问题之间导航的命令。
如有必要,您可以针对特定项目或整个解决方案运行代码检查,并检查在指定范围内找到的问题列表。
此外,您可以启用全方位解决方案,以检测整个解决方案中的所有错误,并扩展当前文件中的代码检查列表(例如,它将查找未使用的公共成员)。
如果需要,您可以使用代码注释来自定义ReSharper检查代码的方式。
另一件好事是您可以根据结构搜索和替换模式定义您自己的自定义代码检查,并为它们指定严重性级别。
代码问题的快速修复
ReSharper可帮助您自动解决大部分发现的代码问题。您所需要的只是Alt+Enter在插入符号时在编辑器中突出显示的代码问题上按下并检查建议的快速修复。
代码探索
ReSharper还提供了不会自动检测代码问题的功能,而是允许您通过深入调查代码来自己发现潜在问题。例如,您可以研究呼叫链并查找特定值的来源和目的地。有关这些功能的更多信息,请参阅代码探索部分。
类型依赖性分析
ReSharper允许您直观地研究类型在解决方案中如何相互依赖。在类型依赖关系图中,您可以添加来自不同项目或编译程序集的任意数量的类型,并可视化它们之间的不同种类的依赖关系。有关更多信息,请参阅探索类型依赖关系图
项目依赖性分析
通过分析解决方案体系结构可能会发现一些代码问题。ReSharper可以通过项目依赖关系分析来帮助您,让您可视化地浏览项目依赖关系图,查找和优化未使用的引用,并检测可能的体系结构问题。
从命令行代码分析
如果您需要将自动代码质量分析集成到CI,版本控制或任何其他服务器中,则可以使用免费的ReSharper命令行工具,并且不需要运行ReSharper或VisualStudio。命令行工具包包含两个工具:
-
InspectCode,它执行数百次ReSharper代码检查
-
dupFinder,它可以检测整个解决方案或范围较窄的重复代码
查找代码检查的代码问题
ReSharper中的静态代码分析称为代码检查,通过对所有支持语言的代码应用2300多个代码检查来执行。
代码问题可以通过几种方式找到:
处理编辑器中突出显示的代码问题的最简单方法是在突出显示的代码项目上设置插入符号,然后按下Alt+Enter或单击代码问题左侧出现的操作指示符。该动作列表会弹出其中ReSharper的建议一个或多个快速修复。
-
ReSharper在编辑器中打开的所有文件在设计时自动查找并突出显示代码问题。
-
您可以在指定范围内找到代码问题,这可能与整个解决方案一样大。
-
您也可以从命令行找到代码问题。
您可以使用结构化搜索和替换模式来扩展默认的代码检查集,并通过使用ReSharper扩展来获取更多特定目的检查(例如拼写检查检查)。
在这个部分:
如有必要,可以通过在特定代码块中插入所有检查(除了那些检测编译器错误的检查),可以通过插入//ReSharperDisableAll前后的代码来禁用所有检查,也可以//ReSharperRestoreAll通过添加以下属性禁用特定类型或成员中的所有检查:[SuppressMessage("ReSharper","All")]。
代码检查
处理编辑器中突出显示的代码问题的最简单方法是在突出显示的代码项目上设置插入符号,然后按下Alt+Enter或单击代码问题左侧出现的操作指示符。该动作列表会弹出其中ReSharper的建议一个或多个快速修复
代码问题可以通过几种方式找到:在所有打开的文件中突出显示设计时代码问题或查找特定范围内的所有代码问题,这些问题可能与整个解决方案一样大。
代码检查大致可以分为以下几组:
您可以使用ReSharper扩展程序为特定目的进行更多检查(例如拼写检查检查)。
-
ReSharper自己的代码检查,其中包括:
-
检查具有固定严重性级别'错误'。这些检查检测编译器错误。
-
代码检查的严重级别
所有ReSharper代码检查以及结构搜索和替换模式都具有以下严重性级别之一:
错误
默认情况下具有"错误"严重性级别的代码检查针对代码问题,这些代码问题会阻止您的代码编译或导致运行时错误。这些检查大部分都是不可配置的,即您无法禁用它们或更改其严重性级别。
在设计时检查中,ReSharper以红色显示未解决的符号:
并用红色下划线突出显示错误陈述或部分错误陈述:
如果当前文件中至少有一个错误,状态指示器将显示错误图标,标记栏上会显示每个错误的红色标记。
如果启用了解决方案范围的分析,则具有"错误"严重性级别的检查中找到的代码问题将显示在"错误/警告"窗口中。
警告
此严重级别对应于编译器警告和其他问题,这些问题不会妨碍您的代码编译,但可能会造成严重的编码效率低下。例如,ReSharper会通知您有关冗余类型转换或命名空间导入指令,不正确的格式字符串,已声明但从未使用过的局部变量或专用字段,未使用的私有方法等。
在设计时检查中,ReSharper使用灰色文本显示冗余符号:
并用蓝色下划线突出显示部分或部分内容:
如果当前文件中至少有一个警告,状态指示器将显示警告图标,并且标记栏上会显示每个警告的黄色标记。
如果启用了包含警告的解决方案范围分析,警告也会出现在"错误/警告"窗口中
建议
具有此严重级别的代码问题提供了代码结构的见解,将您的注意力吸引到了不一定是坏或错误的事情上,但可能有助于了解。
例如,你可能有兴趣知道'参数可以用基类型声明',这意味着你的方法只使用参数基类型的成员。这可能表示出现了不同的错误,例如未考虑到实际参数类型的具体情况。基于这些知识,您可能需要更改参数的类型-或者不是,如果这是设计。
在设计时间检查中,ReSharper用绿色下划线突出显示建议:
并为标记栏上的每个警告添加绿色标记。
如有必要,您可以禁用任何可配置的代码检查。
暗示
这是最低的严重程度。具有这种严重性的代码问题只是将您的注意力引向特定的代码细节,并且/或者建议一种改进方法。
在设计时检查中,ReSharper通过向相应符号的前两个字母添加一个绿色下划线来突出显示提示:
与错误,警告和建议不同,当您在编辑器中的代码问题之间进行导航时,不会考虑提示,并且不会在标记栏中显示提示。
请注意,当您将插入符号设置为高亮提示时,不会显示弹出窗口,相应的消息仅显示在状态栏中。
在VisualStudio项目设置中,您可以选择将警告视为错误。ReSharper知道此选项并相应地强调警告:如果此设置处于打开状态,则与编译器警告相对应的问题将突出显示为错误。该设置可在项目属性中配置:Project|[ProjectName]Properties|Treatwarningsaserrors将警告视为错误,并且可以应用于所有警告,如果选择了全部或仅适用于指定的警告。
大多数代码检查(检测编译器错误的检测除外)的严重级别可以更改,也就是说,您可以根据需要为每个代码检查定义严重级别。
当您检查特定范围的代码,ReSharper会将相应的图标添加到检测到的问题中,并允许按"检查结果"窗口中的严重性级别排序问题。
代码检查类别
ReSharper按几个类别对可配置的代码检查进行分组。这些类别大致定义了检查的目的以及它们检测到的各种代码问题。这些类别用于对CodeInspection|InspectionSeverity检查严重性"页面,并将在特定范围内找到并显示在"检查结果"窗口中的代码问题分组。
-
潜在的代码质量问题
此类别包括检测关键问题(代码气味)的检查,主要是错误或警告级别。此类别还包括确保本地化帮助的检查。 -
常见做法和代码改进
此类别将针对主要影响代码可读性的中等严重性问题进行检查。 -
语言使用机会
此类别包括代码检查,主要包括建议严重性级别,可在使用更高级的语言结构时通知您。这些检查可检测过时语言版本的语法,并建议使用更现代语言版本的功能。对于大多数支持的语言,语言版本可以自动检测或手动设置。 -
代码通知
此类别将代码检查与轻度严重程度进行分组。 -
违反约束条件
此类别包括代码检查,主要是警告严重性级别,用于检测与符号属性相关的违规行为,包括ReSharper的代码注释以及其他类似问题。 -
符号声明中的冗余
此类别包括代码检查,主要包含警告严重性级别,用于检测空的和未使用的符号声明。 -
编译器警告
在编译之前,此类别中的检查会检测编译器警告。 -
NUnit
这些检查检测与NUnit测试相关的代码问题。 -
Clang-TidyChecksClang-Tidy是一款与ReSharperC++集成的强大的开源代码分析工具,
-
Clang
此类检查对应于与ReSharperC++集成的Clang编译器警告。 -
Clang静态分析器检查
此类别中的检查来自与ReSharperC++集成的Clang静态分析器的诊断。
所有静态分析仪检查默认都是禁用的,因为启用它们会显着减慢Clang-Tidy。在设计时检测代码问题
只要在编辑器中打开代码文件,ReSharper就会立即开始分析代码文件,直到它被关闭。所有检测到的代码问题将在编辑器中根据其严重性级别突出显示。问题地图也显示在编辑器窗口右侧的标记栏中,您可以在其中立即查看文件的状态,然后单击标记导航至特定的代码问题。
设计时检查功能
为了说明ReSharper执行的设计时代码检查,请考虑编辑器中显示的以下代码摘录:
在这个相当简单的例子中,我们可以看到ReSharper代码检查的以下特征:
-
状态指示器可帮助您立即查看当前文件是否有错误或警告。
-
修复弹出窗口显示为非导入类型。按下Alt+Enter或单击此弹出窗口就足够了,ReSharper会为文件中的所有类型添加缺少的指令。有关更多信息,请参阅导入缺少命名空间。
-
低优先级代码问题(在这种情况下,与未使用的公共成员相关的建议)呈灰色。
-
一个中等优先级的代码问题(在这种情况下,符号名称不符合命名风格的警告)用蓝色下划线突出显示。
-
在标记栏上显示与错误问题(8)对应的标记。
-
如果ReSharper有任何建议,可以在插入符号的左侧出现一个动作指示符。
-
高优先级代码问题(在这种情况下,与未解决的符号和不正确的返回类型有关的错误)用红色文本和红色下划线突出显示。
-
标记栏上显示与警告问题(4)相对应的标记。
-
状态栏中会显示插入符号处的问题简短说明。您也可以将鼠标悬停在突出显示的代码上或标记栏上的问题标记上查看代码问题的说明(5,6,9)
-
如果启用了解决方案范围分析,则ReSharper允许您查看更多的代码问题。在这个例子中,它检测到未使用的公共成员(3)并通知解决方案的其他文件中的错误。您可以单击解决方案范围的分析图标来浏览检测到的问题。
切换设计时检查
如果您想从代码检查中排除当前文件,请按Ctrl+Shift+Alt+8和ReSharper将该文件添加到排除文件列表中。
如果您打开代码检查排除的文件,您可以通过相应的图标识别它的的状态指示灯。要快速切换当前文件的代码分析,请按Ctrl+Shift+Alt+8。
默认情况下,所有支持的语言都启用设计时代码检查。但是,您可以在任何地方禁用它,或者根据需要关闭特定文件。有关配置代码检查的更多信息,请参阅配置代码检查设置。
禁用或启用设计时代码检查
-
在代码检查CodeInspection|Settings,使用启用代码分析复选框来切换设计时代码检查。当您在此页面上时,您可以查看您可以为代码检查配置哪些选项。
-
如有必要,您可以选择启用整个Enablesolution-wideanalysis复选框以启用全面解决方案分析。
-
单击保存以应用修改,并让ReSharper选择保存它们的位置,或使用保存到下拉列表将修改保存到特定设置图层。有关更多信息,请参阅管理和共享resharper设置。
浏览代码问题
如果启用了设计时代码检查,则可以轻松地在当前文件中检测到的所有问题(除了具有提示严重性级别的问题之间)之间导航。
在代码问题之间导航的另一种方法是在所需范围内运行代码检查,然后在专用工具窗口中研究问题。
导航到当前文件中的下一个/上一个代码问题
-
按Alt+PageDown进入下一个代码问题,或Alt+PageUp转到上一个代码问题。
-
在主菜单中,选择ReSharper|Inspect|NextIssueinFileorReSharper|Inspect|PreviousIssueinFile..
-
使用编辑器窗口右侧的标记栏:单击标记会将插入符号带到相应的问题;点击标记栏顶部的状态指示器会将该插入符号带到文件中的下一个问题。
-
右键单击状态指示器,然后选择转至下一个/上一个错误/警告/建议-这些命令将帮助您在最高严重性级别的问题之间导航。所以如果有错误,它们只能在错误之间导航,一旦所有错误得到解决,它们将在警告之间导航,等等。
如果您只对当前文件中的错误感兴趣,则可以跳过它们跳过较低严重级别的问题。此外,如果启用全解决方案分析,则可以跳转整个解决方案中的错误。请注意ReSharper|Inspect导航命令的名称检查解决方案范围的分析开启状态。下一个错误/警告更改为解决方案中的下一个错误/警告,并且以前的错误/警告将变为解决方案中的以前错误/警告。
如果您对某些代码问题不感兴趣,请在问题时按下Alt+Enter并选择Inspection[nameofinspection].。然后,您可以选择取消此问题的相应代码检查或完全禁用此检查。
导航到下一个/上一个错误
-
按Shift+Alt+PageDown进入下一个错误,或Shift+Alt+PageUp转到上一个错误。
-
在主菜单中,选择ReSharper|Inspect|NextError/WarningorReSharper|Inspect|PreviousError/Warning.
-
如果解决方案范围分析已启用并且存在一些错误,则错误的数量显示在状态栏的右上角。您可以单击此编号以转到解决方案中的下一个错误。
检查选项菜单
除了建议的修复之外,对于每个可配置的代码检查以及定制检查,ReSharper在操作列表中显示Inspection[nameofinspection]子菜单,其中包含以下项目:
-
对于最具争议性的问题,ReSharper有何建议?该项目打开一个代码检查索引页面,并提供相应检查的详细说明。
您可以禁用"检查选项"子菜单。为此,CodeInspection|Settings请清除Showcodeinspectionoptionsinactionlist显示代码检查选项。
寻找类似的问题
您也可以选择查找类似的问题,即在所需范围内应用单个代码检查,您可以在此范围内应用整套ReSharper检查。
您不仅可以通过快速修复修复突出显示的问题,还可以在整个解决方案或更小范围内查找并调查所有类似问题(使用相同代码检查检测到的所有问题)。
找到类似的问题
-
在编辑器中将插入符号设置为突出显示的问题。
-
要查找当前文件中的类似问题,请选择Inspection[nameofinspection]|Findsimilarissuesin[filename]file.查找类似的问题。
-
要找到当前项目或解决方案中的类似问题,请展开子菜单并选择所需的范围:
-
如有必要,您可以在解决方案中的任何项目或解决方案文件夹中搜索类似的问题。为此,请在子菜单中选择Findsimilarissuesincustomscope在自定义范围查找类似问题。
在打开的对话框中,输入所需项目或解决方案文件夹的名称,然后单击确定。 -
所有找到的问题将显示在"检查结果"窗口中。
与VisualStudio代码检查控件集成
从2015年开始,VisualStudio带有自己的代码分析引擎(Roslyn),并提供自己的灯泡功能来执行快速操作,包括重构和修复错误。
VisualStudio的快速操作通常执行与ReSharper的快速修复相同,因此,对于某些错误,您可能会从VisualStudio和ReSharper获得两个类似的防错建议。在下面的插图中,您可以看到两个灯泡都暗示删除多余的using指令:
为了避免这种情况,CodeInspection|Settings在DonotshowVisualStudiobulb.设置页面。此选项在默认情况下处于启用状态,因此除非您禁用它,否则您将看不到重复的灯泡。
虽然ReSharper默认禁止VisualStudio灯泡,但它不会简单地禁用VisualStudio快速操作。对于每个VisualStudio的快速操作,ReSharper执行以下操作:
-
如果有类似的ReSharper的快速修复,VisualStudio的快速操作不会显示。
-
如果没有类似的ReSharper的快速修复程序,则VisualStudio的操作在ReSharper的操作列表中可用。您可以通过特殊图标识别VisualStudio的快速操作。
如有必要,还可以在编辑器中禁用VisualStudio的错误高亮显示,以便仅突出显示ReSharper找到的代码问题。为此,请在抑制SuppressVisualStudiosquiggles波形CodeInspection|Settings。
在特定范围内查找代码问题
您也可以从命令行检查特定范围内的代码,而无需启动VisualStudio和ReSharper。
在编辑器中编写代码或查看特定文件时,设计时代码检查是非常有用的。不过,ReSharper还允许您在整个解决方案或较窄的范围内运行静态代码分析,并以友好的视角查看结果。如有必要,您甚至可以分享检查结果。
开始代码检查
检查解决方案,项目或自定义范围中的代码
-
决定是否要将解决方案范围内的检查结果(例如未使用的公共成员)纳入报告。如果您希望包含这些结果,请启用解决方案的广泛分析。请注意,当启用全解决方案分析时,即使您需要检查单个项目,ReSharper也必须分析整个解决方案,因此需要花费更多时间。
-
执行以下操作之一:
-
在主菜单中,选择ReSharper|Inspect|CodeIssuesinSolutionorReSharper|Inspect|CodeIssuesinCurrentProject.当前项目中的代码问题。
-
在解决方案资源管理器中,选择要检查的项目(文件,文件夹,项目,解决方案文件夹),右键单击选择并在上下文菜单中选择FindCodeIssues查找代码问题。
-
在体系结构视图中,选择一个或多个项目,右键单击选择并在上下文菜单中选择FindCodeIssues查找代码问题。
-
该检验结果窗口将打开显示检测到的代码的问题。
分析检查结果
在"检查结果"窗口中,您可以查看发现的代码问题列表,并通过双击条目在编辑器中找到它们:
每次新的代码检查都将在窗口中打开一个新选项卡,以便保留先前运行的结果,直到您关闭它们的选项卡。
默认情况下,问题按文件分组。如有必要,您可以使用Groupby:选择器按类型,严重程度等重新分组问题。
要检查所选代码问题的上下文,请使用预览窗格,在代码文件中显示与该问题相关的一行或多行。使用"显示预览"选择器打开窗口底部或右侧的窗格。
过滤检查结果
当您检查代码时,ReSharper会应用所有严重级别的代码检查。但是,在检查"提示"严重性时检测到的问题默认被过滤掉。如有必要,您可以自定义代码问题的过滤。
请注意,所选过滤会影响当前标签中过滤代码问题的方式,以及下次运行代码检查时过滤问题的方式。
过滤检查结果中的问题
-
如果要隐藏某种类型的问题或隐藏除此类型问题以外的所有其他问题,请右键单击代码问题并相应地选择HideAll[Issuetype]IssuesorShowOnly[Issuetype]Issues全部隐藏[问题类型]问题或仅显示[问题类型]问题。
-
要进行更精确的过滤,请单击工具栏上的过滤器问题,然后使用"过滤器问题"对话框指定应显示的问题类型。此对话框中的"默认值"按钮会在过滤出"提示"严重级别问题时恢复默认过滤。
分享检查结果
在大型项目中,代码检查结果可以用许多不同的方式使用。例如,要将找到的问题分配给不同的开发人员:您可以复制或导出代码问题或一组问题,并将副本提交给问题跟踪器。
"检查结果"窗口和"解决方案"窗口中的错误/警告都允许将代码问题导出到文本,HTML或XML文件中。
将检查结果导出到文件
-
在"检查结果"窗口中打开代码检查结果或启用解决方案范围分析,并在"解决方案"窗口中的"错误/警告"中打开错误列表。
-
单击导出工具栏上的导出当前显示在文本格式窗口中的数据,或者使用下拉选择将数据导出XML或HTML格式。出现的"导出数据"对话框将帮助您将数据保存到文件或将其复制到剪贴板。
-
将当前问题导出到XML报告的另一种方法是选择ReSharper|Inspect|SaveIssuesReport保存问题报告,然后指定文件名称和位置。
将检查结果保存为XML格式有几个优点:首先,这种格式与InspectCode命令行工具和JetBrainsTeamCity的输出格式兼容,其次,您可以稍后在"检查结果"窗口中加载和研究它。无论用于生成XML报告的工具如何,您都可以随时使用ReSharper打开并检查它。
研究保存在XML报告中的检查结果
-
在主菜单中,选择ReSharper|Inspect|LoadSavedIssuesReport加载保存的问题报告。
-
选择一个XML报告文件,然后单击打开。
-
报告在"检查结果"窗口。如果当前的解决方案与XML报告的解决方案相对应,您将能够通过双击检查结果项目来导航到问题。
除了导出之外,您还可以将单个条目或"检查结果"窗口中显示的条目的自定义选项以及"错误/警告"复制到剪贴板。复制的问题信息包括项目名称和解决方案,文件名称和行号以及问题描述。例如:
解决方案MySolution.sln
项目MyProject
MyProject\About.aspx.cs:2使用指令不需要的代码,可以安全地删除将发现问题的信息复制到剪贴板
-
在"检查结果"窗口或"解决方案"窗口中的错误/警告中选择一个或多个代码问题或问题组。
-
右键单击选择并在上下文菜单中选择复制。
-
在适当的地方粘贴复制的问题。
解决方案范围的分析会在所有支持的语言中发现错误,包括不会阻止项目编译的错误。如果您的项目包含这些文件(例如JavaScript,CSS,HTML),解决方案范围的分析将帮助您找到可能仅在运行时才能检测到的错误。
全面解决方案
ReSharper的解决方案范围分析支持两个相关但不同的功能:
解决方案范围的分析可能需要一些时间才能对解决方案进行初始处理,因此默认情况下它是禁用的。您应该为每个打开的新解决方案明确地打开它。
-
整个解决方案范围的错误/警告监视器可让您不断跟踪解决方案中的所有错误/警告:实际的编译器错误/警告和ReSharper自己的检查以及相应的严重性级别。该功能与设计时代码检测一起工作,并带来两个优点:
-
您不必打开每个文件以确保您的解决方案不包含错误/警告。
-
如果删除公共成员或更改公开成员,则当前文件中的代码可能仍然正确,但如果在解决方案的其他位置使用此成员,该怎么办?例如,假设您将成员的可见性从更改public为internal,假设它仅用于当前项目中。在这个阶段,ReSharper在当前文件中发现没有错误。然后,您打开解决方案范围的分析,实际上有错误。您可以跳到解决方案中的下一个错误并发现有人使用您的解决方案中的另一个项目中的该成员。
您可以配置您是仅在整个解决方案分析中只监视错误还是监视错误和警告。
-
整个解决方案代码检查有助于发现只能通过分析整个解决方案(未使用的公共成员,类和参数,未分配的公共字段,可疑类型转换等)才能检测到的问题。如果启用了解决方案范围分析,则解决方案范围检查所检测到的问题将以与其他问题相同的方式在打开的文件中突出显示,并且当您在特定范围内运行代码检查时,它们也会显示在"检查结果"窗口中。
实现全面的解决方案分析
在继续工作时,初始分析可能需要一些时间才能完成,但在完成后,只能重新分析可能受到最近更改影响的文件。
解决方案范围的分析在默认情况下处于禁用状态,应为每个打开的新解决方案明确打开。
切换解决方案范围的分析
- 在CodeInspection|Settings设置"页面中,确保已选中"启用代码分析"复选框,然后单击"启用全面分析"。默认情况下,解决方案范围的分析中也包含警告,但您可以清除相应的复选框以忽略警告。
- "解决方案范围分析"弹出警告显示,单击"确定"继续。
-
单击保存以应用修改,并让ReSharper选择保存它们的位置,或使用保存到下拉列表将修改保存到特定设置图层。有关更多信息,请参阅管理和共享resharper设置。
在大型解决方案中,解决方案范围内的分析可能会导致性能下降,特别是在初始分析阶段。但是,有几种方法可以提高解决方案范围分析的性能。有关更多信息,请参阅配置解决方案范围分析。
或者,也可以右键单击状态栏右上角的圆圈指示器,然后在上下文菜单中选择"StartSolution-WideAnalysis开始全方位解析"。如果解决方案范围内的分析已关闭,只需双击灰色圆圈即可。
在打开解决方案范围的分析之后,会做出几项更改:
-
状态栏右上角的圆圈指示器显示解决方案范围分析的进度。完成后,指示器变为绿色(如果未找到错误/警告),橙色(如果解决方案范围分析中的警告已启用,并且解决方案中有警告)或红色(如果发现错误):
-
分配圆圈指示符左侧的一个小区域以显示包含错误/警告(如果有)的解决方案文件的数量。您可以单击此区域以转到解决方案中的下一个错误/警告。
-
在设计时代码检查和检查特定范围内的代码时,非私人成员的解决方案范围代码检查都可用。
您可以在CodeInspection|InspectionSeverity可配置代码检查列表ReSharper|Inspect"检查严重性"页面。bytheNon-privateaccessibilitytag非专用辅助功能标签可以识别整个解决方案。
-
导航命令在ReSharper|Inspect检查菜单已更改。具体而言,下一个错误/警告变为下一个错误/警告在解决方案和NextError/WarninginSolutionandPreviousError/WarningbecomesPreviousError/WarninginSolution.。
配置全面解决方案分析
当您首次启用此选项时,将执行解决方案范围分析的主要计算。根据解决方案的大小,这些计算可能需要几秒钟到几十分钟。你仍然可以继续工作,但是有些性能下降是可能的。
解决方案范围的分析在默认情况下处于禁用状态,应为每个打开的新解决方案明确打开。
启用后,解决方案范围的分析可能还会广泛使用内存。如果您注意到您的系统资源受到太多影响,则可以执行以下操作之一:
-
暂停/恢复解决方案范围分析
如果您关闭解决方案范围的分析,然后决定再次打开它,则ReSharper将不得不重复一些初始计算,这可能会很耗时。为了避免这种情况,您可以暂停并恢复解决方案范围内的分析。
暂停并恢复解决方案范围的分析
-
在"错误/警告"窗口的工具栏上,单击暂停分析或继续分析。
-
右键单击状态栏右上角的圆圈指示器,然后在上下文菜单中选择暂停分析或继续分析。
在整个解决方案分析中包括/排除警告
默认情况下,解决方案范围分析会监控解决方案中的错误和警告:只要解决方案中存在错误,只会显示错误;当最后一个错误得到解决时,将会出现未解决的警告。如果您只想监视错误,则可以禁用警告;在这种情况下,只要最后一个错误被修复,状态栏指示灯就会变绿。
在解决方案范围分析中包含/排除警告
-
在"错误/警告"窗口的工具栏上,单击包含/排除警告。
-
在CodeInspection|Settings页面中,使用"启用全解法分析"下的"包括警告"复选框。
监视解决方案中的错误/警告
ReSharper|Windows|SolutionErrors
ReSharper_ShowErrorsView您可以配置您是仅在整个解决方案分析中只监视错误还是监视错误和警告。
在启用解决方案范围分析的同时,您可以使用状态栏指示器来监控解决方案中的错误/警告,并且可以在解决方案中的错误/警告窗口中获得解决方案中所有错误/警告的详细报告。
您可以复制到剪贴板或导出到文件来共享发现的问题。
查看解决方案中找到的错误列表
- 启用全面解决方案分析。
- 请执行以下任何操作:
- 选择ReSharper|Windows|SolutionErrors主菜单中的错误。
- 右键单击状态栏右上角的圆圈指示器,然后从下拉列表中选择"ShowErrorsView显示错误视图"。
-
双击圆圈指示器。
无论哪种方式,打开"错误/警告"窗口,您可以在其中查看检测到的错误/警告列表,并通过双击条目导航至相关代码:
即使没有打开此窗口,您仍然可以使用Shift+Alt+PageDown/Shift+Alt+PageUp(ReSharper|Inspect|NextError/Warning/ReSharper|Inspect|PreviousError/Warning)轻松浏览解决方案中的错误,或者只需单击错误/警告状态栏指示符左侧。
作为监测解决方案中的错误/警告的替代方法,您可以在解决方案或更小范围内找到所有问题,并在"检查结果"窗口中查看它们。
如果ReSharper无法找到发现错误的文件,则其在"解决方案中的错误"对话框中的条目将标记为黄色警示三角形,如同在解决方案资源管理器中一样。
如有必要,您可以配置解决方案范围的分析或忽略特定的错误/警告。
在解决方案中忽略错误/警告
在解决方案开发的某个阶段,您可能会遇到太多错误/警告。ReSharper允许您灵活地忽略一些错误或包含错误的文件,并且不会将它们包含在解决方案范围内的分析结果中。
您可以配置您是仅在整个解决方案分析中只监视错误还是监视错误和警告。
这些项目将在"解决方案"窗口中的错误/警告中的错误列表中隐藏,它们不会影响状态栏指示器的状态。必要时,您可以停止忽略这些项目以显示它们。
要允许解决方案范围的分析忽略特定的错误/警告
- 如果启用了解决方案范围分析,请选择ReSharper|Windows|SolutionErrors或双击状态栏右上角的圆圈指示器。
- 在"错误/警告"窗口中,选择发现的错误/警告或包含文件以忽略其中的所有问题。
- 点击工具栏上的忽略错误/警告。如果您选择了一个文件,ReSharper会忽略它包含的所有问题,并从列表中删除它的条目。
如果您选择了单个错误/警告,则ReSharper只会忽略此特定项目并将其从列表中删除。 -
要查看忽略的错误/警告,请单击工具栏上的显示忽略的错误/警告-您将看到解决方案中的所有错误/警告,忽略的项目显示为划掉。即使您选择在列表中显示被忽略的项目,它们也不会影响状态栏指示符。
停止忽略解决方案中的特定错误/警告
- 如果启用了解决方案范围分析,请选择ReSharper|Windows|SolutionErrors或双击状态栏右上角的圆圈指示器。
- 在"错误/警告"窗口的工具栏上,单击"显示忽略的错误/警告"。
- 选择一个被忽略的项目或文件。这些项目显示为划掉。
-
点击停止忽略错误/警告以停止忽略所选项目。
全面解决方案代码检查
大多数代码检查只需要单个文件的源代码来工作并检测代码问题。除了这些检查之外,ReSharper还提供整个解决方案的检查,目标代码问题仅在整个解决方案的范围内可检测到:
-
它们仅在启用解决方案范围分析时才有效。。
-
他们中的大多数有助于检测未使用的非私人成员(详情请参见下面的列表)。
-
如果启用了解决方案范围分析,则解决方案范围检查所检测到的问题将以与其他问题相同的方式在打开的文件中突出显示,并且当您在特定范围内运行代码检查时,它们也会显示在"检查结果"窗口中。但是,它们不会出现在"解决方案"窗口中的"错误/警告"中。
-
像往常一样,对于任何此类警告或建议,ReSharper提供一个或多个快速修复。
如果您对某些代码问题不感兴趣,请在问题时按下Alt+Enter并选择Inspection[nameofinspection]检查[检查名称]。然后,您可以选择取消此问题的相应代码检查或完全禁用此检查。
如有必要,您可以禁用整个解决方案范围的检查,或者仅对特定项目中的内部符号启用解决方案范围的检查。为此,请在解决方案资源管理器中选择项目,并使用VisualStudio的"属性"窗口中的"全方位检查"选择器。请注意,独立于此选择器中的值,如果在ReSharper选项中禁用解决方案范围分析,则解决方案范围检查将被禁用。
此外,两个代码注释,UsedImplicitlyAttribute并且MeansImplicitUseAttribute,可如果他们被闲置特意为纪念某些非私有类型和成员。如果没有装饰符号的用法,这些属性将抑制ReSharper检查。
具体而言,解决方案范围的警告和建议可帮助您发现:
-
未使用的非私有类型或成员声明:
-
未使用的非私有方法的返回值。
-
非私人成员中未使用的参数。
-
未分配的字段。
-
未访问的非专用字段。
-
可以成为内部,私人或受保护而非公开的成员和类型:
-
非私人classes可以进行密封。
-
非私人classesormembers可以变成静态的成员。
-
非私有localvariablesorfields局部变量或可以转换为常量的字段。
-
非专用字段Non-privatefields可以是只读的:
-
Non-privateclasseswithneveroverriddenvirtualmembers。
-
Non-privateeventsthatareneversubscribedto未订阅。
-
Abstractorvirtualevents从未被调用的抽象或虚拟事件:
-
Auto-implementednon-privatepropertyaccessors自动实现的非私有属性访问器,从不使用。
-
可疑的类型转换或检查Suspicioustypeconversionsorchecks.。
-
非私有类型的成员,从来没有通过基类型或接口使用Non-privatetypemembersthatareneverusedviabasetypeorinterface
-
非专用类型成员只能从覆盖中进行访问Non-privatetypemembersthatareonlyaccessedfromoverrides
-
可以用IEnumerable<T>类型声明的非私有方法的参数Parametersofnon-privatemethodsthatcanbedeclaredwithIEnumerable<T>type
-
非私有方法Non-privatemethods可以具有IEnumerable<T>返回类型
-
冗余方法重载Redundantmethodoverloads
-
永不实例化的非静态类Non-staticclassesthatareneverinstantiated
配置代码检查设置
切换设计时代码检查
默认情况下,ReSharper在与所支持的语言相对应的所有文件中启用设计时代码检查。如有必要,您可以禁用它。无论设计时代码检查是否启用,您都可以在特定范围内始终运行代码检查。
禁用或启用设计时代码检查
-
在CodeInspection|Settings页面,使用启用代码分析复选框来切换设计时代码检查。当您在此页面上时,您可以查看您可以为代码检查配置哪些选项。
-
如有必要,您可以选择启用整个解决方案分析复选框。
-
单击保存以应用修改,并让ReSharper选择保存它们的位置,或使用保存到下拉列表将修改保存到特定设置图层。有关更多信息,请参阅管理和共享resharper设置。
从代码检查中排除文件和文件夹
ReSharper允许您配置应从代码检查中排除的文件,文件掩码和文件夹的列表。排除的项目在特定范围内/设计时代码检查忽略,但它们仍由ReSharper索引,以便您可以导航到或重构代码检查中排除的符号。
从代码检查中排除文件和文件夹
-
打开CodeInspection|Settings页面。
-
在"Skippedelements跳过的元素"部分的左侧部分,使用"添加文件"和"添加文件夹"按钮指定代码检查将忽略的文件或文件夹。
-
在本节的右侧部分,使用添加按钮来指定屏蔽(例如*.xml),它将从代码检查中排除解决方案中的所有匹配文件。
-
单击保存以应用修改,并让ReSharper选择保存它们的位置,或使用保存到下拉列表将修改保存到特定设置图层。有关更多信息,请参阅管理和共享resharper设置。
您还可以快速从代码检查中排除当前文件,以便ReSharper将该文件添加到排除文件列表中,而无需打开选项。
如果您打开代码检查排除的文件,您可以通过相应的图标识别它的的状态指示灯。
从代码检查中排除/包含当前文件
-
按Ctrl+Shift+Alt+8。
-
右键单击状态指示器并选择暂停/恢复分析。
对生成的代码部分禁用代码检查
您还可以配置包含生成的代码的文件,文件夹,文件掩码和区域的列表。对于这些项目,ReSharper只运行代码检查,检查编译器错误和警告的代码。VisualStudio用于生成代码的一些文件掩码和区域(例如*.designer.cs)默认包含在此列表中,但如果需要,您可以更改默认设置。
用生成的代码指定文件和区域
-
在CodeInspection|GeneratedCode生成代码页的ReSharper选项,使用添加文件和添加文件夹按钮来指定包含生成代码的文件或文件夹。
-
在页面的左下角,使用Add按钮为生成的代码文件指定掩码(例如*.Designer.cs)。
-
在页面的右下角,使用Add按钮来指定包含生成代码的区域的名称。
-
单击保存以应用修改,并让ReSharper选择保存它们的位置,或使用保存到下拉列表将修改保存到特定设置图层。有关更多信息,请参阅管理和共享resharper设置。
包含生成代码的项目列表也可用于禁用代码样式并清除生成的代码。
更改代码检查的严重级别
每个ReSharper的代码检查都有其自己的默认严重级别,该级别根据检测到的代码问题的潜在影响进行设置。大多数检查都具有可配置的严重性级别,您可以更改该级别。
请注意,检测编译器错误和警告的检查具有相应的严重性级别,这些级别不能更改。但是,对于一些编译器警告,您可以使用#pragma指令来抑制它们。根据特定的警告,在动作列表中查找#pragma动作。
您可以在编辑器中更改检查权限的严重性级别,其中突出显示此检查发现的代码问题。
要更改编辑器的检查严重性
-
将插入符号设置为由ReSharper检查突出显示的代码问题。
-
在操作列表中,选择Inspection[nameofinspection]|Configureinspectionseverity检查[检查名称]|配置检查严重性,然后选择新的严重性级别:
-
您的更改将使用智能保存逻辑进行保存。
-
如果您需要将修改的严重性级别保存在共享设置图层中,请单击Configureinspectionseverity配置检查严重性菜单项或Enter在选择时按下。在出现的对话框中,选择所需的严重性级别,单击保存到,然后选择所需的设置图层。
另一种在共享设置图层中保存修改的严重性级别或修改多个检查的严重级别的方法是使用ReSharper选项对话框,如下所述。
修改代码检查的严重程度
-
在CodeInspection|InspectionSeverity检查严重性"页面,您可以查看所有可配置的代码检查及其严重性级别。检查按语言分组,然后按类别分组。
-
找到并选择要修改其严重性的检查。要查找检查,只需输入其名称即可。
-
单击所选条目右侧的下拉列表,然后选择所需的严重性级别:
-
如果检查的默认严重性级别发生更改,则会在其旁边显示"重置为默认值"按钮,这样您可以将严重性重置为默认值。
同样的按钮也出现在这种检查属于的类别旁边。单击某个类别旁边的此按钮可将该类别内的所有检查重置为其默认严重性级别。 -
单击保存以应用修改,并让ReSharper选择保存它们的位置,或使用保存到下拉列表将修改保存到特定设置图层。有关更多信息,请参阅管理和共享resharper设置。
禁用/启用特定的代码检查
如果某些代码检查看起来微不足道或对您不感兴趣,则可以禁用此检查,以避免在编辑器中突出显示相关问题或在运行代码检测到特定范围。您可以随时启用禁用的代码检查。一些检查默认是禁用的,您可以根据需要启用它们。
您可以通过以下方式之一禁用任何代码检查:
-
如果在编辑器中检查时突出显示代码问题,请在突出显示的代码上设置插入符号,然后按Alt+Enter,然后选择Inspection[nameofinspection]|Configureinspectionseverity|Donotshow.配置检查严重性|不要显示。
-
在CodeInspection|InspectionSeverity检查严重性"页面,使用搜索框查找要禁用的检查,然后清除其旁边的复选框,或者选中它以启用禁用的检查。
已禁用/已启用的检查状态将保存在共享设置图层中,与更改严重性级别的方式完全相同。
在特定范围内抑制代码检查
忽略特定代码问题的一种方法是禁用相应的代码检查。在这种情况下,所有检测到的代码问题都会被忽略。
有时候您可能需要在特定地点抑制特定检查,同时在其他地方继续检测与此检查相关的其他类似问题。
例如,ReSharper认为某些代码"死",你可以看到它是真的。检查是有用的,你不想禁用它。但是,您可能希望稍后使用此代码,并且不希望它在编辑器中突出显示或出现在检查结果。为此,ReSharper允许您通过评论或属性来抑制检查。对于任意代码段来说,评论更方便,属性更适合压制整个方法或类型的检查。在特定范围内禁用(取消)代码检查
-
将插入符号设置为由ReSharper检查突出显示的代码问题。
-
在操作列表中,选择以下选项之一:
-
Inspection[nameofinspection]|Disableoncewithcomment禁用一次带注释-该选项会插入一个注释-ReSharperdisableonce[inspectionalias]-只会抑制首次出现相应问题时的检查。
-
Inspection[nameofinspection]|Disableoncewithcomment|Disableinfilewithcomment在注释中禁用文件-此选项在文件ReSharperdisable[inspectionalias]的开头插入单个注释。此评论取消了对文件中所有相应问题的检查。
-
Inspection[nameofinspection]|Disableoncewithcomment|Disableandrestorewithcomment禁用一次评论|使用注释禁用和恢复-此选项在问题之前和之后插入一对注释-ReSharperdisable[inspectionalias]andReSharperrestore[inspectionalias].这些评论压制了他们之间所有相关问题的检查。
然后,您可以将这些注释移动到文件中的其他位置,这样可以抑制这类问题。例如,如果要保留多个未使用的名称空间导入,这可以用于抑制"冗余名称空间"检查。 -
Inspection[nameofinspection]|Disableoncewithcomment|Disableformethod禁用一次评论|禁用方法-此选项将下列属性添加到方法中:[SuppressMessage("ReSharper","[inspectionalias]")].。该属性禁止该方法中的检查。
-
Inspection[nameofinspection]|Disableoncewithcomment|Disableforclass禁用一次评论|禁用类-此选项将以下属性添加到类中:[SuppressMessage("ReSharper","[inspectionalias]")].。这个属性抑制了整个班级的检查。
-
Inspection[nameofinspection]|Disableoncewithcomment|Disableallinspectioninfile禁用一次评论|禁用文件中的所有检查-此选项将在文件ReSharperdisableAll的开头插入单个注释。这个评论压制了所有的检查文件。
如有必要,您可以ReSharperrestoreAll在特定行之后插入启用代码检查。要抑制类型或方法中的所有检查,请添加以下属性:[SuppressMessage("ReSharper","All")]。
创建自定义代码检查和快速修复
如果您在代码中看到问题或不正确的做法,但ReSharper无法检测到,则可以创建自定义代码检查。此外,您可以指定应该替换有问题的代码的代码,换句话说,就是定制的快速修复程序。
如果自定义检查已正确创建,它将能够在您的代码库中查找所有类似问题,并在编辑器中突出显示有问题的代码。
要创建自定义检查,您可以利用结构搜索和替换机制。
为了说明创建定制检测,让我们假设我们不喜欢以下代码:
Stringline;
Vartr=newMyReader();
try
{
Line=tr.Read();
}
finally
{
tr.Dispose();
}
..而宁愿用以下代替它:
Stringline;
using(vartr=newMyReader())
{
line=tr.Read();
}
使用快速修补程序创建自定义代码检查
- 在编辑器中,选择一个应该被视为问题的代码。
- 右键单击选择并选择SearchwithPattern使用模式搜索。
- ReSharper显示带模式搜索对话框,所选代码预先解析为搜索模式。一些标识符,参数,类型等会被占位符自动替换
- 为了使检查模式更加通用,请编辑已识别的占位符:并用更多占位符替换其他代码项。例如,我们可以使用try与任意数量的语句匹配的占位符来替换我们示例中块中的单个语句。
-
要指定问题的快速修复,请单击对话框右上角的替换。
在"替换模式"区域中,指定应该用来替换有问题的代码的模式。对可变代码项使用相同的占位符。
下面是我们的例子中精炼的模式和快速修复程序的样子: - 完成后点击保存然后关闭。自定义检查使用智能保存逻辑保存在模式目录中。
请注意,有问题的一段代码在编辑器中尚未突出显示。我们需要做更多的事情才能实现。 - 在主菜单中,选择ReSharper|Options并进入CodeInspection|CustomPatterns自定义模式页面。
- 在模式列表中,找到与您刚刚创建的自定义检查对应的模式。默认情况下,其严重性级别设置为"不显示",这意味着ReSharper将忽略与您的定制检查相对应的问题。
要启用检查,请选择任何其他严重级别,例如"建议"。 -
最后,我们可以指定将显示的定制检查和相应的快速修复的描述。
为此,请双击该模式,然后在打开的EditHighlightingPattern编辑高亮模式对话框中指定相应字段中的说明:您可以为模式指定一个"抑制键"-一个标识符,您可以使用该标识符来抑制检测模式使用情况的ReSharper检查,并附带评论。
-
保存对模式的更改,关闭它,然后再次单击ReSharper选项的CustomPatterns页面上的Save。
现在这个问题在编辑器中得到了认可和强调。当您将鼠标悬停在其上时,会显示指定的说明:
当我们改进了检查模式时,即使构造函数调用中的参数数量不同或语句数量不同,它也会发现类似的问题:
定制检测的快速修复看起来和工作方式与内置快速修复程序完全相同。
如果您需要在更大的范围内找到您的自定义模式所描述的问题,那么您有几个选择:
-
选择CodeInspection|CustomPatterns"自定义模式"页面,然后单击页面工具栏上的"SearchNow立即搜索"。
-
在所需范围内运行代码检查,然后使用其余检测到的代码问题分析您的自定义问题。
-
按编辑器中突出显示的代码时,使用检查选项中显示的查找类似问题操作Alt+Enter。
Value和可空性分析
ReSharper执行值分析以帮助您查找可能的'空'取消引用以及冗余布尔比较和空检查。
分析Value的不同方式
ReSharper以两种常规方式分析值:
您可以使用快速修复功能立即解决这些问题(例如自动添加可空性检查)。
-
通过理解语言结构的行为。
在下面的例子中,基于obj显式检查参数是否为可空性的事实,ReSharper合理地认为值obj的确可以是'null'并显示相应的警告:`
-
通过依赖代码注释属性([CanBeNull],[NotNull],[ItemCanBeNull],[ItemNotNull])
在此示例中,该方法Bar用[CanBeNull]属性标记。使用此信息,ReSharper警告您返回值Bar可为null,并调用一个方法可能会导致'null'取消引用:如有必要,您可以使用合同注释更精确地进行代码分析。它们可以帮助您定义函数参数与其返回值之间的依赖关系。
value和可空性分析模式
ReSharper可以分析不同模式下的值:
-
乐观
默认情况下,价值分析模式是乐观的。在这种模式下,如果显式检查值是否为空,或者符号是用[CanBeNull]or[ItemCanBeNull]属性标记的,ReSharper只会提示可能的'空'取消引用。乐观模式在上面的例子中得到了证明。 -
悲观
在这种模式下,ReSharper会警告所有上下文中可能的'空'取消引用,除非该符号被标记为[NotNull]or[ItemNotNull]属性,否则不会显式检查值是否为空。要更改值分析模式或禁用分析,请在Valueanalysismode值分析模式首选项ReSharper选项的设置页面。
value分析的其他例子
以下是ReSharper价值和可空性分析的更多例子:
-
如果已经使用简单的LINQ查询完成了可空性检查,ReSharper会告诉您进一步的可空性检查是多余的:
-
如果使用[ItemNotNull]属性标记集合,则会发生同样的情况:
-
下一个例子说明在启用悲观模式时价值分析如何工作。检查列表的值是否为空,但不是列表项。因此ReSharper在这里警告可能的'空'取消引用。
集合访问分析
ReSharper执行集合值分析以帮助您查找可能的'空'引用以及冗余布尔比较和空检查。分析值,ReSharper还会分析您作为一个整体使用的每个集合-它会在集合永远不会被填充或修改时发出警告,即使有对此集合的读取访问权限:
或者相反,如果一个集合永远不会被读取:
所有标准集合类型默认都以这种方式进行分析。如果有必要,您还可以将此分析应用于从中派生的自定义集合IEnumerable。在这种情况下,您需要告诉ReSharper集合的公共方法的调用将如何影响集合的内容。要做到这一点,标志着集合类与方法[CollectionAccessAttribute],其中应该有四个标志之一:None,Read,ModifyExisitingContent,UpdatedContent(最后两个标志之间的区别是,UpdatedContent意味着标记的函数也可以向集合添加新元素)。下面是一个简单的例子来说明这一点:
代码分析和字符串文字助手
ReSharper为您的代码中的字符串文字提供了一堆功能。您可以从ReSharper的代码分析和众多帮手中获益:
-
纯字符串
以下是在您的代码中使用纯字符串时ReSharper如何帮助您:
-
默认情况下,ReSharper在所有非逐字字符串中突出显示正确和不正确的转义序列:
-
您可以将常规字符串转换为逐字字符串,并Alt+Enter在字符串中选择相应的上下文操作时按下。这也适用于插入的字符串。
-
你可以简单地按下来分割字符串文字Enter。
-
您可以在字符串中选择一些子字符串并自动为子字符串引入一个变量。
-
如果您的项目是可本地化的,则可以自动将字符串移至资源。
字符串格式化方法
ReSharper的分析格式字符串和所有的.NET字符串格式化方法的参数,例如String.Format,Text.StringBuilder.AppendFormat或Console.WriteLine。
在使用字符串格式化方法时,ReSharper突出显示格式占位符,并在插入符号时同时突出显示占位符和相应的参数:
如果参数和格式占位符不匹配(导致FormatException运行时缺少参数),ReSharper会为缺少或冗余参数生成警告:
按下Alt+Enter警告即可轻松解决此问题。ReSharper会建议自动添加缺少的参数或删除不匹配的格式占位符。
ReSharper还可以帮助您检测并移除其他字符串格式化方法中的字符串格式化方法的多余调用。例如:
要快速转换字符串文字和变量Alt+Enter的连接,请按连接中的任意位置并使用"到String.Format调用上下文"操作。例如,如果我们return在以下方法的声明中应用此上下文操作:
Public string Greet(stringname,intage)
{
Return "Hi,mynameis"+name+"andI'm"+age;
}
它将被转换为:
Public string Greet(stringname,intage)
{
Return String.Format("Hi,mynameis{0}andI'm{1}",name,age);
}
您还可以使用上下文操作自动添加和删除字符串中的格式占位符和参数。当您在字符串文字中调用插入格式参数动作时,ReSharper会插入一个具有正确索引的新占位符,并将您带到可以立即开始输入参数的位置。这个动作也可以在普通字符串上调用。在这种情况下,ReSharper会自动将其转换为String.Format call。
为了快速删除格式占位符以及相应的参数,请在占位符处设置插入符号,然后按Alt+Enter并选择删除格式参数Removeformatargument.。
自定义字符串格式化方法
当出现自定义的字符串格式化方法时,您必须告诉ReSharper将其解释为这样,这很容易-您需要使用[StringFormatMethodAttribute]来自JetBrains.Annotations命名空间的方法来修饰该方法。只要该方法具有此属性,您将享受可用于标准格式化方法功能。
考虑一个自定义的字符串格式化方法ShowError:
PublicvoidShowError(stringformatString,paramsobject[]args)
{
//somecustomlogic
Console.WriteLine(formatString,args);
}
如果方法调用不正确,如下所示,ReSharper无法检测到缺少的参数:
让ReSharper知道一个自定义的字符串格式化方法
-
使用该[StringFormatMethodAttribute]属性注释自定义字符串格式化方法,该属性只接受一个参数-格式字符串参数的名称:
[StringFormatMethod("formatString")]
PublicvoidShowError(string formatString,paramsobject[]args)
{
//somecustomlogic
Console.WriteLine(formatString,args);
}
当调用此自定义格式化方法时,ReSharper现在可以警告您缺少参数。更重要的是,添加参数快速修复会让您更容易地插入它们:
您可以使用外部注释在编译的库中注释自定义字符串格式化方法。
插值字符串
如果您在项目中使用C#6.0,则可以使用插值字符串而不是String.Format方法。
默认情况下,ReSharper根据关联的编译器自动检测C#版本。但是,您可以显式指定目标C#版本-右键单击解决方案资源管理器中的项目,从上下文菜单中选择编辑项目项目属性,然后使用C#语言级别选择器..
在C#6.0项目中,ReSharper强调使用String.Format建议将它们转换为内插字符串的建议。您可以使用快速修复功能将当前使用情况或特定范围内的所有使用情况转换为几个按键。
如果插入的字符串不包含任何表达式,则ReSharper将该$符号突出显示为冗余,并帮助您将其删除:
使用注解来优化代码检查
ReSharper为您的代码中的字符串文字提供了一堆功能。您可以从ReSharper的代码分析和众多帮手中获益:代码检查和许多其他ReSharper功能在很大程度上依赖于了解语言构造的行为以检测问题,提出可能的改进,并以其他方式为您提供帮助。
但是,这种分析无法检测到任何事情。例如,如果一种方法被设计为永不返回null并且其客户端被相应地设计,则没有结构分析会发现可能的问题:有人已经改变返回null。
在这个和许多其他案例中,ReSharper的JetBrains.Annotations帮助很大。通过使用此框架中声明的属性,您可以使ReSharper按您需要的方式分析代码。例如:
[NotNull]
PublicobjectFoo()
{
Returnnull;//Warning:Possible'null'assignment
}
这是最简单的例子,还有其他有用的属性和更复杂的用例。您可以在参考中找到这些属性的完整列表。
在大多数情况下,代码注释属性启用特定的代码检查,例如:
-
StringFormatMethodAttribute有助于检测字符串格式化方法的滥用情况。
-
CanBeNullAttribute并且NotNullAttribute与可能的'空'分配关联到标有'值不能为空'属性的实体。有关更多信息,请参阅值和可空性分析。
-
CannotApplyEqualityOperatorAttribute绑定到代码检查:与'CannotApplyEqualityOperatorAttribute'标记的'=='类型进行比较。
-
ContractAnnotationAttribute可用于为您的功能定义合同并打开相应的检查。例如,您可以使用[ContractAnnotation("input:null=>false")]通知功能的消费者boolFoo(objectinput),它总是返回false时的参数s是null。
此外,代码注释还可以在注释项上启用更多快速修复,代码完成建议和代码生成功能。注释也需要创建和使用源模板。
ReSharper允许您用两种方式注释代码符号:
部分标注库(例如.NETFramework类库,NUnitFramework等)以及外部注释的工作已经完成,并且这些库的外部注释包含在ReSharper安装中。因此,使用这些库时,您可以从属性驱动的检查,快速修复和其他功能中受益。
-
您可以在源代码中注释符号,如上例所示。在这种情况下,您需要JetBrains.Annotations在您的项目中引用命名空间。有关更多信息,请参阅源代码中的注释。
-
即使您无法访问源代码,也可以在编译的库代码中注释符号。有关更多信息,请参阅外部注释。
源代码中的注释
从ReSharper的代码注释中获益的最简单方法是将注释属性添加到源代码的符号中,并使ReSharper以更高的准确性和洞察力分析您的解决方案。
默认情况下,所有注记属性类都被标记为[Conditional("JETBRAINS_ANNOTATIONS")]属性,因此编译器将忽略代码中的属性用法,这意味着不会生成对'JetBrains.Annotations.dll'程序集的二进制引用。但是,您可以在项目中定义'JETBRAINS_ANNOTATIONS'条件编译符号以保留元数据中的属性。
在您的项目中启用代码注释支持
要在项目中使用ReSharper代码注释属性,您应该通过以下方式之一引用它们:
-
推荐的方法是在程序集中安装NuGet包JetBrains.Annotations。
实际上,你甚至不需要到NuGet网站去获取软件包。只需添加usingJetBrains.Annotations;指令,并使用相应的操作来自动获取软件包。 -
-
您可以简单地将项目引用添加到JetBrains.Annotations.dll,您可以在ReSharper安装目录中找到它。
-
您还可以使用默认名称空间或任何其他名称空间在您的项目中的任何位置嵌入属性声明JetBrains.Annotations。
如果引用了JetBrains.Annotations.dll,或者属性声明嵌入到解决方案中的任何项目中,则可以键入所需的注释属性,然后按Alt+Enter以调用将在当前项目中引用此模块的快速修复程序,并添加缺少命名空间导入指令:
或者,您可以按Shift+Alt+Space两次以调用双重导入完成,它将查找该属性,导入命名空间并添加引用。
在您的源代码中嵌入代码注释的声明
您可以在CodeInspection|CodeAnnotations代码注释页面。或者,在复制时,您可以选择将内部声明和/或将[Conditional("JETBRAINS_ANNOTATIONS")]声明添加到声明中。
注释属性的默认实现是在JetBrains.Annotations名称空间中声明的,但这个名称空间并不是注释工作所必需的。您可以在您的解决方案的任何位置放置声明-ReSharper会自动检测它们。但是,如果声明位于不同的名称空间中,则应该使用注释属性显式指定名称空间,如下所述。
当你的解决方案包含几个注释属性的实现时,也可能会出现这样的情况,例如,你有一些名字与ReSharper注释类相同的类(CanBeNullAttribute,NotNullAttribute等),或者您正在使用包含ReSharper注记类的第三方程序集。在这种情况下,您可以选择ReSharper应查找适当的注释属性类集的名称空间。更改代码注释属性的来源
-
选择CodeInspection|CodeAnnotations。
-
除了JetBrains.Annotations注释类(ReSharper只会查找CanBeNullAttribute和NotNullAttribute声明)之外的所有名称空间(来自源代码和引用程序集)都显示在Namespaceswithcodeannotationattributes带有代码注释属性列表的名称空间中。检查包含所需实施的条目。
-
如果列表中有多个名称空间,请在Defaultannotationnamespace默认注释命名空间下拉列表中选择它应该由ReSharper代码分析引擎使用的名称空间。
-
单击保存以应用修改,并让ReSharper选择保存它们的位置,或使用保存到下拉列表将修改保存到特定设置图层。有关更多信息,请参阅管理和共享resharper设置。
使用上下文动作来添加注释属性
只要ReSharper知道注释类的位置,就可以使用上下文操作来添加最流行的注释属性:
-
[NotNull]
-
[CanBeNull]
-
[UsedImplicitly]
要添加这些注释,请按要注释Alt+Enter的符号,ReSharper将根据上下文建议一个属性:
外部注释
怎么运行的
如果您使用的是外部库,但其源不可用,则使用其中的属性来指定代码注释似乎不可行。
在这种情况下,您可以使用外部注释,它允许您使用ReSharper的代码分析引擎识别的属性补充已编译的实体。外部注释让你"欺骗"引擎,让它看到属性(对于方法,参数和其他声明),这些属性在编译库时没有声明。
外部注释在XML文件中指定。加载解决方案时,ReSharper会在特定位置查找特定命名的XML文件,并从中读取注释。这些XML文件具有类似于XmlDoc的结构。例如,XmlReader.Create(Streaminput)要从System.Xml.NETFramework4.0的程序集中注释该方法与NotNull合约,该XML文件如下所示:
<assemblyname="System.Xml, Version=4.0.0.0">
<!--The attribute name contains the assembly name. If you don't specify the version,
this file's attributes will be applied to all versions of the assemblies of that name -->
<membername="M:System.Xml.XmlReader.Create(System.IO.Stream)">
<!--This shows the name of the member whose attributes are complemented;
the notation is the same as XmlDoc -->
<attributector="M:JetBrains.Annotations.NotNullAttribute.#ctor"/>
<!--attribute constructor names are also specified using XmlDoc notation -->
<parametername="input">
<attributector="M:JetBrains.Annotations.NotNullAttribute.#ctor"/>
</parameter>
</member>
</assembly>
JetBrains外部注释
上述方法用于在.NETFramework类库以及其他常用库中注释大量符号。使用ReSharper安装这些库的外部注释以确保更好的代码分析。一些功能(例如ASP.NETMVC5.2支持)也依赖于外部注释。
创建外部注释
创建自己的注释时,您可以使用ReSharper注释作为参考。要研究ReSharper外部注释,请查看[ReSharper安装目录]\ExternalAnnotations目录的子目录中的XML文件。
您可以创建外部注释以指定任何已编译程序集的合同。为了确保ReSharper识别带有外部注释的XML文件,应该将该文件命名为[AssemblyName].ExternalAnnotations.xml,并将其放在与程序集*.dll文件相同的文件夹中。
为了说明创建外部注释,假设您使用一个带方法的类的TestLib程序集。假设,从汇编文档中,你知道该方法是纯粹的,永远不会返回null,并且它的参数不应该为null。MyTestClassstaticstringReverseString(StringinputString)
最初,ReSharper不知道如何ReverseString工作,因此它在以下代码中找不到问题:
要为name注释中的属性获取正确的符号ID,请在原始符号上使用"将XML-DocID复制到剪贴板"命令。
为已编译的程序集创建外部注释
-
找到TestLib.dll你的文件系统中,创建一个文件名为TestLib.ExternalAnnotations.xml在同一个文件夹中。
-
打开TestLib.ExternalAnnotations.xml进行编辑并输入以下内容:
<assemblyname="TestLib">
<membername="M:TestLib.MyTestClass.ReverseString(System.String)">
<attributector="M:JetBrains.Annotations.NotNullAttribute.#ctor"/>
<attributector="M:JetBrains.Annotations.PureAttribute.#ctor"/>
<parametername="inputString">
<attributector="M:JetBrains.Annotations.NotNullAttribute.#ctor"/>
</parameter>
</member>
</assembly>
-
重新加载您的解决方案。现在ReSharper检测到不正确的使用情况,ReverseString并强调null参数的问题:
-
...和不必要的返回值检查:
-
要查看哪些外部注释应用于库元件,可以使用快速文档功能。只要按Ctrl+Shift+F1符号来研究它的属性。在我们的例子中,我们可以看到这个ReverseString注解[NotNull]和[Pure]属性,并且参数被注释为[NotNull]:
属性的灰色意味着它们不是来自汇编代码,而是来自外部注释。
分发外部注释
使用外部注释的另一种情况是为您的dll发布外部注释。在这种情况下,您的dll也使用ReSharper或Rider,将获得更多的建议和修复。
库的外部注释可以作为NuGet包发布并从ReSharper库安装。要了解有关打包外部注释的更多信息,请参阅ReSharper插件开发指南。
契约注释
有时您可能想使用更简单的替代方案,而不是合同注释。例如,你的函数从不返回'null',你可以使用该[NotNull]属性。有关更多信息,请参阅值和可空性分析。
契约注释使您可以为给定输入定义预期输出,或者换句话说,定义函数的引用类型和布尔参数与其返回值之间的依赖关系。契约注释的机制允许创建可以更简单和更安全的方式使用的API。
您可以通过使用装饰功能来实现契约注释[ContractAnnotationAttribute]。如果您想在源代码中执行此操作,请参阅JetBrains.Annotations命名空间。您还可以使用外部注释在现有二进制模块中注释函数。
怎么运行的
要快速了解如何以及为什么可以使用合同注释,请查看下面的示例。
在这个例子中,我们Adjust用注释属性修饰了函数。在这种情况下,属性参数意味着一个null参数总是产生一个空返回值。你可以很容易地阅读这个例子的代码,看看这个函数是如何工作的,但在现实生活中,这种依赖关系可能并不那么明显。无论如何,这里主要的是合约注释属性,它描述了函数如何处理输入值。
当我们Adjust用'null'参数调用函数时,ReSharper会立即查找并突出显示一堆问题。首先,它突出显示带有空参数的函数调用,并警告该表达式始终为空。然后,它会跟踪adjusted用此表达式初始化的变量,现在也是'null'。当我们检查adjusted不等式的变量为'null'时,ReSharper再次警告我们,这种比较总是错误的。最后,ReSharper将'if'语句中的代码灰显为不可访问:
契约注释的语法
使用以下语法指定合同注释的输入输出依赖关系:
[ContractAnnotation("[paramName:][input]=>output[;[paramName:][input]=>output]",[forceFullStates:true])]input可以是:
-
null/notnull用于参考类型参数
-
true/false用于布尔参数。
Output可以是:
-
null/notnull/canbenull参考类型的返回值
-
true/false为布尔类型的返回值
-
halt|stop|void|nothing(可互换)以指示该功能不能正常返回。也就是说,它会抛出异常或暂停程序执行。
可选的布尔forceFullStates参数(默认为false)允许您为可空性分析强制使用悲观模式。也就是说,如果方法返回值没有被合约条件定义,ReSharper会认为它可能为空。
备注:
-
paramName如果只有一个参数,可以省略(参见上面的例子)
-
您可以省略两者paramName,input如果没有参数:
-
[ContractAnnotation("=>halt")]
Public void TerminationMethod()
或者如果函数在输入上独立地具有相同的输出:
[ContractAnnotation("=>halt")]
Public void TerminationMethod(object data,bool flag)
-
您可以为相同的参数添加多个条件:
-
[ContractAnnotation("input:null => null;input:notnull => notnull")]
Public object Transform(object input,bool flag)
-
您可以反转条件,即input=>output等于output<=input:
-
[ContractAnnotation("null<=param:null")]
Public string GetName(string surname)
-
您还可以指定'out'参数的期望值。如果您想为相同的输入条件指定返回值和"out"参数,请使用逗号:
-
[ContractAnnotation("s:null=>false,result:null")]
Public bool TryParse(strings,out object result)
契约条件的确认
如果您使用源代码中的契约注释修饰功能,ReSharper会根据功能签名验证合同条件。如果合同注释不符合功能参数,ReSharper会显示警告:
如果合同注释不符合返回值,也会发生同样的情况。