【问题标题】:Suppress code analysis warnings for conditional methods禁止条件方法的代码分析警告
【发布时间】:2015-11-03 19:38:47
【问题描述】:

对调用 Conditional 方法的代码运行代码分析 (Visual Studio 2015) 会导致未使用的本地变量 (CA1804) 或未使用的参数 (CA1801) 出现警告。例如。为:

using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        [Conditional ("NEVER_DEFINED")]
        static void Log(string message)
        {
            System.Console.WriteLine("Demo conditional message logging: " + message);
        }

        static void Main(string[] args)
        {
            string message = "Only log this when `NEVER_DEFINE` is #defined";
            Log(message);

            Method("other message");
        }

        static void Method(string messageToLog)
        {
            Log(messageToLog);
        }
    }
}

代码分析结果:

  • 警告 CA1801

    “Program.Main(string[])”的参数“args”从未使用过。移除参数或在方法体中使用。

    ConsoleApplication1 …\Program.cs 14

  • 警告 CA1804

    'Program.Main(string[])' 声明了一个'string' 类型的变量'message',它从不使用或只分配给它。使用此变量或将其删除。

    ConsoleApplication1 …\Program.cs 15

  • 警告 CA1801

    从未使用过“Program.Method(string)”的参数“messageToLog”。删除参数或在方法体中使用它。

    ConsoleApplication1 …\Program.cs 22

我认为关于 messagemessageTolog 的警告是误报。有没有办法让代码分析将条件方法视为使用参数?

【问题讨论】:

    标签: c# conditional undefined code-analysis


    【解决方案1】:

    您可以在System.Diagnostics.CodeAnalysis 中使用[SuppressMessageAttribute]。但是,您必须将其应用于调用Conditional-方法的每个方法(或在更广泛的范围内应用它);例如:

    [System.Diagnostics.CodeAnalysis.SuppressMessage ("Microsoft.Performance", "CA1804")]
    static void Main(…)
    {
        …
    }
    
    [System.Diagnostics.CodeAnalysis.SuppressMessage ("Microsoft.Performance", "CA1801")]
    static void Method(…)
    {
        …
    }
    

    【讨论】:

    • 调用这些条件日志方法的方法很多。我更喜欢不需要在每个方法上都进行注释的解决方案。
    【解决方案2】:

    在调用的条件方法中添加CODE_ANALYSIS条件属性,例如:

    using System.Diagnostics;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            [Conditional ("NEVER_DEFINED")]
            [Conditional ("CODE_ANALYSIS")]
            static void Log(string message)
            {
                System.Console.WriteLine("Demo conditional message logging: " + message);
            }
    
            static void Main(string[] args)
            {
                string message = "Only log this when `NEVER_DEFINE` is #defined";
                Log(message);
    
                Method("other message");
            }
    
            static void Method(string messageToLog)
            {
                Log(messageToLog);
            }
        }
    }
    

    现在Log(string) 被视为使用其参数,并且提供给它的所有参数和局部变量也被视为已使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多