抑制条件方法的代码分析警告
Suppress code analysis warnings for conditional methods
运行 对调用 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
我认为关于 message
和 messageTolog
的警告是误报。有没有办法让代码分析将条件方法视为使用参数?
您可以在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(…)
{
…
}
将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)
被视为使用其参数,并且所有提供给它的参数和局部变量也被视为已使用。
运行 对调用 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
我认为关于 message
和 messageTolog
的警告是误报。有没有办法让代码分析将条件方法视为使用参数?
您可以在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(…)
{
…
}
将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)
被视为使用其参数,并且所有提供给它的参数和局部变量也被视为已使用。