Code Analysis和SupressMessage - 你应该用#if DEBUG包装属性吗?

时间:2016-10-18 14:21:11

标签: c# visual-studio-2015 code-analysis roslyn

我正在使用SupressMessage来吃一些CA警告。 SupressMessage的文档说要确保它不在发布版本中。因此,SupressMessage属性是否应该包含在#if DEBUG中,如下所示?

public class Class1
{
#if DEBUG
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "args")]
#endif
    static void Main(string[] args) { }

#if DEBUG
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
    "CA1806:DoNotIgnoreMethodResults", MessageId = "System.Guid")]
#endif
    public static bool IsValidGuid(string guid)
    {
        try
        {
            new Guid(guid); //Causes CA1806: DoNotIgnoreMethodResults
            return true;
        }
        catch (ArgumentNullException) { }
        catch (OverflowException) { }
        catch (FormatException) { }
        return false;
    }
}

参考:有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/ms244717.aspx

  

您不应在发布版本上使用源内抑制,以防止意外传送源内抑制元数据。由于源内抑制的处理成本,通过包含源内抑制元数据,您的应用程序的性能也会降低。

1 个答案:

答案 0 :(得分:2)

不,你不应该。只需确保您的发布版本没有定义条件编译符号CODE_ANALYSIS

原因是SuppressMessageAttribute有一个[ConditionalAttribute("CODE_ANALYSIS")],这意味着它不会包含在输出DLL中,除非定义了CODE_ANALYSIS

正如the documentation所说:

  

将ConditionalAttribute应用于属性表示除非定义了条件编译符号,否则不应将该属性发送到元数据。

请注意,启用“在构建时启用代码分析”可能会将条件编译符号CODE_ANALYSIS添加到构建设置中,因此请确保在发布版本中不是这种情况。