ReSharper 2026.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: Memory allocation issues" :任何内存分配问题。

    • "DPA0002: Excessive memory allocations in SOH" :分配到小对象堆。

    • "DPA0003: Excessive memory allocations in LOH" :分配到大对象堆。

    • "DPA0004: Closure object allocation" :因闭包导致的分配。

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

    • "DPA0006: Large number of DB commands" :大量数据库命令执行。

    • "DPA0007: Large number of DB records" :数据库响应中的大量记录。

    • "DPA0008: Large number of DB connections" :大量同时数据库连接。

    • "DPA0009: High execution time of DB command" :命令执行时间过长。

  • 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.Object 或 System.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. 执行以下操作之一:

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

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

2026年 7月 16日