抑制条件方法的代码分析警告

时间:2015-08-11 14:10:27

标签: c# conditional undefined code-analysis

对调用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

    参数' args' ' Program.Main(string [])'从未使用过。删除参数或在方法体中使用它。

    ConsoleApplication1 ... \ Program.cs 14

  • 警告CA1804

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

    ConsoleApplication1 ... \ Program.cs 15

  • 警告CA1801

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

    ConsoleApplication1 ... \ Program.cs 22

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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)使用其参数,并且也考虑使用提供给它的所有参数和局部变量。