我正在使用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


  您不应在发行版本上使用源内抑制,以防止意外交付源内抑制元数据。由于源内抑制的处理成本较高,因此,通过包含源内抑制元数据,还可能降低应用程序的性能。

最佳答案

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

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

正如the documentation所说:


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


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

10-06 14:48