ReSharper 2025.2 Help

缩小 DPA 范围

在某些情况下,您可能希望从 DPA 问题列表中排除某些问题。

主要情况包括:

这不是一个问题

在某些情况下,DPA 会将某个特定方法标记为问题,尽管一切都按预期工作。 例如,一个方法可能会分配大量内存,这并不是因为代码设计不良,而是因为当前用例需要这样做。 如果只是少数方法,最好的解决方案是 抑制这些问题。 如果您遇到大量误报,那么可能更好的方法是 提高问题阈值

您不是此代码的所有者或目前对分析它不感兴趣

大型解决方案包含数百个项目,许多人同时在其上工作。 DPA 允许您 从分析中排除解决方案的特定部分 ,以便您只保留与当前工作相关的问题。

此问题已被修复

一种罕见的情况是,您已经修复了问题,但尚未再次运行/调试解决方案。 如果您希望此类问题从列表中隐藏,您可以 将问题标记为已修复

简要总结:

通过 VCS 共享

隐藏问题直到

粒度

抑制

永久

方法

排除

永久

进程、模块、类、方法

标记为已修复

直到下一次运行

方法

提高阈值

永久

解决方案

抑制问题

要抑制一个问题,您必须使用 SuppressMessage 属性标记相应的方法。 抑制问题的主要好处是该属性设置在源代码中,因此可以通过 VCS 共享。 设置属性的最简单方法是使用上下文操作。

  1. 在编辑器中,找到您想要抑制的方法。 请注意, SuppressMessage 属性使 DPA 忽略的不仅是方法本身的内存分配,还包括所有子调用中的分配。

  2. 将光标放在 DPA 高亮显示的行上,然后按 Alt+Enter

  3. 在上下文操作列表中,选择 忽略 {内存分配 | 数据库} 问题 ,然后选择您希望在当前调用子树中抑制的内容:仅选定的问题、此类型的所有问题或所有问题。

    DPA. 抑制问题

您可以手动设置 SuppressMessage 属性。 例如:

[SuppressMessage("ReSharper.DPA", checkId: "DPA0002: Excessive memory allocations in SOH", MessageId = "type: Sudoku.Cell")] public Cell Copy() => new Cell(Number, _options);

这里:

  • "ReSharper.DPA" 是所需的属性类别。

  • checkId 指定必须抑制的问题类型(描述是可选的):

    • "DPA0001:内存分配问题" :任何内存分配问题。

    • "DPA0002:SOH 中的内存分配过多" :分配到小对象堆。

    • "DPA0003:LOH 中的内存分配过多" :分配到大对象堆。

    • "DPA0004:闭包对象分配" :因闭包导致的分配。

    • "DPA0005:数据库问题" :任何数据库问题。

    • "DPA0006:数据库命令数量过多" :大量数据库命令执行。

    • "DPA0007:数据库记录数量过多" :数据库响应中的大量记录。

    • "DPA0008:数据库连接数量过多" :大量同时数据库连接。

    • "DPA0009:数据库命令执行时间过长" :命令执行时间过长。

  • MessageId 允许您通过问题值缩小属性的范围。 您应使用键值对列表设置范围过滤器: "key1: value1; key2: value2; ..." 可用的键如下:

    • type:EXACT_FQN :抑制分配指定类型对象的问题。 EXACT_FQN 是类型的全名,包括命名空间和所有泛型类型的替代。

    • size:VALUE "B"、"KB"、"MB"、"GB"、"TB" :如果分配对象的总大小小于 VALUE ,则抑制分配问题。

    • count :如果对象(命令、记录或连接)的总数小于 VALUE ,则抑制数据库问题。

    • time :如果命令执行时间(以毫秒为单位)小于 VALUE ,则抑制数据库命令执行时间问题。

    例如: "type: System.Object; type: System.String; size: 500MB"

    此过滤器意味着 DPA 必须抑制与 System.ObjectSystem.String 类型对象的分配相关的所有问题,除非分配对象的总大小小于 500MB。

从分析中排除代码

当您对分析代码的某一部分不感兴趣时,例如它与您的当前工作无关,可能需要排除。 您可以排除特定的进程、模块、类和方法:相关问题将从 动态程序分析 窗口和编辑器中隐藏。 请注意,您仅为自己排除代码:排除的问题不会传播到 VCS。

从动态程序分析中排除代码

  1. 打开 扩展 | ReSharper | Windows | 动态程序分析 | 筛选

  2. 筛选器 中,单击 添加添加 ... 旁边的所需过滤规则:

    • 代码分析的唯一范围 :指定要包含在动态分析中的进程、模块、类和/或方法。 所有其他代码项将被排除。 代码项彼此独立过滤。 例如,您可以指定一个方法,并为模块和类保留星号 * ,以仅包含所有模块和类中具有指定名称的方法。

    • 代码分析的排除范围 :指定要从动态分析中排除的进程、模块、类和/或方法。 代码项彼此独立过滤。

将问题标记为已修复

将问题标记为已修复与排除类似。 主要区别在于排除是永久的,而“标记为已修复”会隐藏问题,直到您运行/调试解决方案:如果问题实际上没有修复,DPA 会将其返回到问题列表中。

  1. 打开动态程序分析 窗口。

  2. 选择问题,按 Delete 或在上下文菜单中选择 忽略 | 标记为已修复

更改问题阈值

DPA 仅在检查值超过阈值时将方法标记为问题。 例如,在运行期间,该方法分配到 LOH 55 MB,而阈值为 50 MB。 因此,消除误报的最简单方法是提高相应的阈值。 请注意,没有通用的阈值:根据当前的执行上下文,您的应用程序可能会分配不同数量的内存。 例如,您的应用程序处理的数据大小可能会因运行而异。

您可以在 阈值 选项卡的 动态程序分析 窗口中为每种问题类型设置阈值。 默认阈值为:

  • 闭包对象:50 MB

  • 大对象堆:50 MB

  • 小对象堆:100 MB

  • 数据库命令时间:500 毫秒

  • 数据库连接:10

  • 数据库命令:50

  • 数据库记录:100

  • MVC 操作:500 毫秒

  • Razor 页面处理程序:500 毫秒

  • Razor 视图组件:300 毫秒

  1. 打开动态程序分析 窗口。

  2. 执行以下操作之一:

    • 选择超过当前阈值的问题,然后在上下文菜单中选择 忽略 | 设置新的阈值为 ...。 这将把相应的阈值设置为刚好高于问题的分配值。

    • 切换到 阈值 选项卡,并为所需的问题类型设置一个新的阈值。

最后修改日期: 2025年 9月 27日