如何使用#pragma 警告禁用 CA1814?

Posted

技术标签:

【中文标题】如何使用#pragma 警告禁用 CA1814?【英文标题】:How do you disable CA1814 with #pragma warning? 【发布时间】:2018-10-24 13:34:07 【问题描述】:

我的背景:我有一个包含大量行的文件会导致此警告(此特定警告对我来说毫无意义,因为数组大小相同)。

为了排除一些晦涩的项目设置,我创建了一个简单的玩具示例。在这里,我使用规则集“Microsoft All Rules”。以下仍然给我警告,包括 CA1814:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2

    class Program
    
        static void Main(string[] args)
        
#pragma warning disable 1814 
            var test = new int[0,0,0];
            var b = new Banana();
#pragma warning restore 1814 
            return;
        
    

    class Banana : IDisposable
    
        public void Dispose()
        
            Console.WriteLine("What a waste");
        
    

我不确定这是否有某种关联,但即使存在所有这些错误,我也可以使用警告级别:4,将警告视为错误:“全部”来构建项目。

编辑:我也试过 CA1814 而不是 1814

【问题讨论】:

尝试从 main 中添加 #pragma .... 将 Main 包装在 #pragma 警告中 ...应该可以解决问题 我刚试过,但它仍然没有抑制警告。 【参考方案1】:

CS1814 本身不是编译器警告;这是一个代码分析警告。您已对项目启用静态代码分析,并已选择加入所有规则。不过,您可能并不在意关注所有这些,而这正是您遇到的问题。

您可能想要自定义您的规则集。您可以通过以下两种方式之一做到这一点:

    使用SuppressMessage 属性选择性地禁用警告 Create a new set of rules 基于“Microsoft 所有规则”集,并将其配置为不包含 CS1814。

对于第一种方法,将以下属性添加到文件或方法的顶部:

[SuppressMessage("Microsoft.Performance", "CA1814:PreferJaggedArraysOverMultidimensional")]

【讨论】:

我目前正在做 1。但由于行数,它看起来很荒谬。对于 2.,我们有太多的人在做这个项目(我认为没有人想为规则集的修改开创先例,包括我自己)。因此,我希望有第三种方式。 我知道不想成为第一个修改规则集的人,但根据我的规则集经验,您几乎总是希望以某种方式自定义它们。有一个巨大的厨房水槽,里面装满了规则,我认为决定有些规则与您的项目无关,这根本不是一个黑标。使用新的自定义规则集意味着每个人都可以共享它,您不必一遍又一遍地隐藏相同的消息。 另外,我不理解您所说的某些内容-也许您可以澄清一下。你说你目前正在遵循方法#1。在那种情况下,你为什么要使用 #pragma 指令?这些是不是和抑制属性一样冗长? 据我了解,我可以使用#pragma 禁用整个代码部分的警告,而使用抑制功能,我需要为每个违规行添加一个 SuppressMessage 属性。如果属性允许对某些区域进行受控抑制,我会很好地使用属性。 我明白了。如果您关注我发布的关于 SuppressMessage 属性的链接,您将看到它如何针对给定的行、方法、类甚至整个项目。

以上是关于如何使用#pragma 警告禁用 CA1814?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用#pragma 警告?

7.5 pragma 指令

#pragma 警告(push) 没有 #pragma 警告(pop)

将警告视为错误无效

msvc pragma 警告在 cpp 文件中省略“默认”

无法禁用特定编译器警告 (4100)