【问题标题】:Can't suppress CA1502无法抑制 CA1502
【发布时间】:2017-09-02 16:03:25
【问题描述】:

我有一堂课是这样开始的:

namespace Tools.Builders
{
    internal abstract class Builder
    {
        [SuppressMessage("Microsoft.Maintainability", "CA1502")]
        private static readonly Dictionary<string, Func<ILogger, Builder>> _builders =
            new Dictionary<string, Func<ILogger, Builder>>
        {
            { "1", (x) => {return new BuilderType1(x);} },
            { "2", (x) => {return new BuilderType2(x);} },
            { "3", (x) => {return new BuilderType3(x);} },
            { "4", (x) => {return new BuilderType4(x);} },
            { "5", (x) => {return new BuilderType5(x);} },
            { "6", (x) => {return new BuilderType6(x);} },
            { "7", (x) => {return new BuilderType7(x);} },
            { "8", (x) => {return new BuilderType8(x);} },
            { "9", (x) => {return new BuilderType9(x);} },
        };
        protected ILogger _logger;
        protected Builder(ILogger logger)
        {
            _logger = logger;
        }
        //...

这会导致 CA1502 警告,形式为“Builder.Builder() 的圈复杂度为...”(这是此类初始化程序的一个已知问题)。但是我的问题是我无法抑制警告。我尝试将 SuppressMessageAttribute 放在代码中的各种不同位置,但它只是被忽略了。有什么建议吗?

【问题讨论】:

  • Docs: “必须定义预处理器符号“CODE_ANALYSIS”才能使此属性生效。缺少预处理器符号会导致属性不被应用。”
  • 嗯,我试过了,但没有任何区别。还是谢谢。
  • 我不确定这里有什么意义。有人建议我尝试#pragma warning(disable: 1502),但该评论似乎已经消失了。正如 buffjape 的链接指出的那样,这将是针对编译器警告而不是 CA 警告,所以没有多大帮助。同时,我对实际问题没有进一步了解。

标签: c# code-analysis maintainability


【解决方案1】:

我能够通过使用将构造函数指定为目标的程序集级属性来抑制此消息:

using System.Diagnostics.CodeAnalysis;

[assembly: SuppressMessage("Microsoft.Maintainability",
                           "CA1502:AvoidExcessiveComplexity",
                           Scope = "member",
                           Target = "Tools.Builders.Builder.#.cctor()")]

这个属性可以放在程序集中的任何代码文件中。

为了将来参考,我通过右键单击错误列表窗口(或 VS2013 及更早版本的代码分析窗口)中的 CA 警告并选择 Suppress -> In Suppression File 来生成此属性。

【讨论】:

  • 这是一个巧妙的技巧。将属性从 GlobalSuppressions.cs 中复制出来,然后可以将其删除 - 将它放在它所应用的源中会更整洁。这解决了我的问题,谢谢。 (顺便说一句,您的意思是代码分析窗口而不是错误列表窗口)
  • @Dave 从 VS2015 开始,他们结合了这些窗口 - 我将进行编辑以注意差异。
【解决方案2】:

将以下属性应用于有问题的方法在 VS 2017 中对我有用

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]

【讨论】:

  • 这就是我已经尝试过的 - µS 必须在 2017 年修复它(我在 2012 年)
猜你喜欢
  • 2023-02-01
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 2015-01-14
相关资源
最近更新 更多