115

我在 C# 项目中有一个 HTTPSystemDefinitions.cs 文件,它基本上描述了旧的 Windows ISAPI 以供托管代码使用。

这包括与 ISAPI 相关的完整结构集,而不是全部或由代码使用。在编译时,这些结构的所有字段成员都会导致如下警告:-

警告字段“UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader”从未分配给,并且始终具有其默认值 null

或者

警告从未使用过“UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus”字段

这些可以被禁用#pragma warning disable吗?如果是这样,相应的错误编号是多少?如果没有,我还能做些什么吗?请记住,我只对此文件执行此操作,重要的是我会看到来自其他文件的此类警告。

编辑

示例结构:-

struct HTTP_FILTER_PREPROC_HEADERS
{
    //
    //  For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
    //  Header names should include the trailing ':'.  The special values
    //  'method', 'url' and 'version' can be used to retrieve the individual
    //  portions of the request line
    //

    internal GetHeaderDelegate GetHeader;
    internal SetHeaderDelegate SetHeader;
    internal AddHeaderDelegate AddHeader;

    UInt32  HttpStatus;               // New in 4.0, status for SEND_RESPONSE
    UInt32  dwReserved;               // New in 4.0
}
4

4 回答 4

204

是的,这些可以被压制。

通常,我反对抑制警告,但在这种情况下,用于互操作的结构绝对需要存在一些字段,即使您从未打算(或不能)使用它们,所以在这种情况下,我认为它应该是合理的.

通常,要抑制这两个警告,您将修复有问题的代码。第一个(“...从未使用过”)通常是早期版本代码中残留的代码气味。也许代码被删除了,但留下了字段。

第二个通常是错误使用字段的代码气味。例如,您可能错误地将属性的新值写回属性本身,而从未写入支持字段。


要禁止“从未使用字段 XYZ”的警告,请执行以下操作:

#pragma warning disable 0169
... field declaration
#pragma warning restore 0169

要禁止“ Field XYZ is never assigned to, and will always have its default value XX ”的警告,请执行以下操作:

#pragma warning disable 0649
... field declaration
#pragma warning restore 0649

要自己查找此类警告编号(即我怎么知道使用 0169 和 0649),请执行以下操作:

  • 正常编译代码,这会在 Visual Studio 的错误列表中添加一些警告
  • 切换到输出窗口和构建输出,并寻找相同的警告
  • 复制相关消息中的 4 位警告代码,该代码应如下所示:

    C:\Dev\VS.NET\ConsoleApplication19\ConsoleApplication19\Program.cs(10,28):警告 CS 0649:字段“ConsoleApplication19.Program.dwReserved”从未分配给,并且始终具有其默认值 0


警告:根据@Jon Hanna的评论,对于这个问题和答案的未来发现者,也许有一些警告是为了这个。

  • 首先,压制警告的行为类似于吞服头痛的药丸。当然,有时这可能是正确的做法,但这并不是一个包罗万象的解决方案。有时,头痛是您不应该掩盖的真实症状,警告也是如此。始终最好尝试通过修复其原因来处理警告,而不是盲目地将它们从构建输出中删除。
  • 话虽如此,如果您需要抑制警告,请按照我上面列出的模式。第一个代码行,禁用该文件其余部分#pragma warning disable XYZK的警告,或者至少在找到对应的之前。尽量减少禁用这些警告的行数。上面的模式只禁用一行的警告。#pragma warning restore XYZK
  • 此外,正如乔恩所提到的,对你为什么这样做的评论是一个好主意。如果无缘无故地禁用警告绝对是一种代码异味,并且注释会阻止未来的维护者花时间想知道您为什么这样做,或者甚至删除它并尝试修复警告。
于 2010-09-29T11:10:52.987 回答
15

修复这些警告的另一个“解决方案”是制作 struct public。然后不会发出警告,因为编译器无法知道这些字段是否在程序集之外使用(分配)。

也就是说,“互操作”组件通常不应该是公共的,而应该是internalor private

于 2012-09-27T09:54:26.663 回答
6

我让 VS 为其生成实现框架,System.ComponentModel.INotifyPropertyChanged事件被实现为触发 CS0067 警告的字段。

作为已接受答案中给出的解决方案的替代方案,我将字段转换为属性并且警告消失了

这是有道理的,因为属性声明语法糖被编译成一个字段加上引用该字段的 getter 和/或 setter 方法(在我的情况下为添加/删除)。这满足了编译器并且不会引发警告:

struct HTTP_FILTER_PREPROC_HEADERS
{
    //
    //  For SF_NOTIFY_PREPROC_HEADERS, retrieves the specified header value.
    //  Header names should include the trailing ':'.  The special values
    //  'method', 'url' and 'version' can be used to retrieve the individual
    //  portions of the request line
    //

    internal GetHeaderDelegate GetHeader {get;set;}
    internal SetHeaderDelegate SetHeader { get; set; }
    internal AddHeaderDelegate AddHeader { get; set; }

    UInt32 HttpStatus { get; set; }               // New in 4.0, status for SEND_RESPONSE
    UInt32 dwReserved { get; set; }               // New in 4.0
}
于 2012-01-06T16:33:16.257 回答
1

C/C++ 用户必须(void)var;禁止未使用的变量警告。我刚刚发现您还可以使用位运算符在 C# 中抑制未使用的变量警告:

        uint test1 = 12345;
        test1 |= 0; // test1 is still 12345

        bool test2 = true;
        test2 &= false; // test2 is now false

在 VS2010 C# 4.0 和 Mono 2.10 编译器中,这两个表达式都不会产生未使用的变量警告。

于 2014-05-12T21:32:21.263 回答