禁用和恢复#pragma warning警告

40

我使用C#创建了第一个项目,但是遇到了很多警告错误,这些警告错误都是要变成单个错误(内部编译器错误,请参阅控制台日志获取更多信息)。

为了减少警告错误,我在有问题的代码前后使用了#pragma Warning disable和#pragma warning restore。

我不确定在我的最终版本中是否应该保留 #pragma warning disable & restore,还是需要将其删除?例如:

#pragma warning disable
if (Displayer.instance != null && CTR.Tore== "Keepit")
{
    Displayer.instance.SetFielderProfile (i);
}
#pragma warning restore

最后构建时我需要将其删除吗?

4个回答

72

至少您应该明确哪些警告是您有意忽略的。这样,如果以后的维护引入了一个您需要知道的“新”警告/问题,新引入的错误的警告不会被您的全局禁用指令所忽略。

您可以从Visual Studio的构建输出窗口中获取与您决定忽略的构建问题相关的警告编号。它们通常标有“Warning CS0168....”或类似的标签。在这种情况下,您可以像这样专门针对您决定忽略的那些错误:

#pragma warning disable 168, 3021

    //Your code that generates warnings CS0168 and CS3021 here

#pragma warning restore 168, 3021

25
我建议始终添加一条注释,解释为什么0128和3021在此不适用;部分原因是如果你无法写出合理的解释,那么就只是掩盖了一个漏洞;另外这也能让其他人在查看时区分开发者做出的合理决策和懒惰的掩盖行为。 - Jon Hanna
3
#pragma warning disable CS0168, CS3021 也可以使用。 - Soner from The Ottoman Empire

8

如果代码有实际价值,你就不应该有任何警告,并使用所有警告开启的“将警告视为错误”设置进行编译。

你展示的代码本身似乎没有错误。因此,我看不出为什么需要这个指示。

但这真的是你的决定——你的代码,如果没有人需要使用/查看/付费——那就做适合你的事情。


1
我不同意。例如,我曾经有一些需要从特定接口继承的类。这些接口有时会包含我在特定实现中不需要的事件。为什么不能使用#pragma指令来消除未使用事件的警告呢? - shai tibber
1
如果你有充分的理由(并提供好的内联注释),在代码中禁用偶发的警告是完全可以接受的。问题中的代码没有表明需要这样的预编译指令……我相信你提到的情况不应该引起警告,因为编译器不能将接口的实现视为“未使用”——单独提出一个关于为什么会收到警告的问题可能是一个好主意(确保搜索是否已经有关于你所收到的任何警告的好答案)。 - Alexei Levenkov
1
@AlexeiLevenkov - 感谢您的评论。首先,我认为说“如果代码具有任何实际价值,您不应该收到任何警告”意味着这在所有情况下都是正确的,而不仅仅是在这个问题上。其次,我给出的示例经过检查并生成警告cs0067。您可以轻松地测试它(确保将警告级别设置为4)。 - shai tibber

0

将 @Deleted 的答案适配到 MSVC 和 C++ 中。在 Visual Studio 2019 中进行测试。有关 C# 的内容,请参阅 Deleted 的答案。适用于通过网络搜索找到此处的任何人。

在 C++ 代码中禁用警告:

#pragma warning(push)
#pragma warning(disable : 4267 4293)

    // Your code that generates warnings C4267 and C4293 here

#pragma warning(pop)

-3

我在我的asp.net mvc (.net core)应用程序中遇到了这个错误。根据上面和其他文章显示,这个错误来自于你的c sharp代码在chtml侧。

为了确定问题,只需打开控制台或在单独的窗口中打开cshtml。

我有一个弹出窗口,在这个弹出窗口中出现了这个错误,我单独打开这个弹出窗口,并在控制台中调查错误时,发现一个分号不在cshtml中,因此在渲染chtml时会抛出错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接