在C#中禁止“从不使用”和“从不分配给”警告

我在C#项目中有一个HTTPSystemDefinitions.cs文件,它基本上描述了由托pipe代码使用的较早的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 } 

是的,这些可以被压制。

通常情况下,我反对禁止警告,但在这种情况下,用于互操作的结构绝对需要一些字段存在,即使你从来没有打算(或可以)使用它们,所以在这种情况下,我认为这应该是有道理的。

通常,为了抑制这两个警告,您可以修复有问题的代码。 第一个(“…从来没有使用”)通常是代码的早期版本的剩菜的代码味道。 也许代码被删除了,但是领域落后了。

第二个通常是不正确使用的字段的代码气味。 例如,您可能会错误地将属性的新值写回属性本身,而不写入后备字段。


要禁止“ Field XYZ is never used ”的警告,请执行以下操作:

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

要禁止“ 字段XYZ永远不会分配给,并将始终具有其默认值XX ”的警告,您可以这样做:

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

要自己find这样的警告号码(即我怎么知道使用0169和0649),你这样做:

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

    C:\ Dev \ VS.NET \ ConsoleApplication19 \ ConsoleApplication19 \ Program.cs(10,28):警告CS 0649 :字段'ConsoleApplication19.Program.dwReserved'永远不会被分配给,并将始终具有其默认值0


警告 :根据@Jon Hanna的评论,或许有几个警告是为了这个,为今后的发现者提供这个问题和答案。

  • 首先,最重要的是,压制警告的行为类似于吞咽头痛的药丸。 当然,有时可能是正确的做法,但这不是一个全面的解决scheme。 有时,头痛是一个你不应该掩盖的真正的症状,与警告一样。 试着通过固定原因来处理警告总是最好的,而不是盲目地将它们从构build输出中移除。
  • 话虽如此,如果你需要抑制一个警告,按照上面列出的模式。 第一个代码行#pragma warning disable XYZK ,会禁用该文件其余部分的警告,或至less会find相应的#pragma warning restore XYZK 。 尽量减less你禁用这些警告的行数。 上面的模式只能禁用一行警告。
  • 另外,正如Jon提到的,对于你为什么这样做的评论是一个好主意。 禁用警告无疑是一种代码异味,并且评论会阻止未来的维护人员花时间想知道为什么你这样做,甚至通过删除它并尝试修复警告。

解决这些警告的另一个“解决scheme”是将结构public 。 这样就不会发出警告,因为编译器无法知道程序集外部是否正在使用(分配)字段。

也就是说,“interop”组件通常不应该公开,而应该是internalprivate

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

作为接受答案中给出的解决scheme的替代, 我将这些字段转换为属性,警告消失

这是有道理的,因为属性声明语法糖被编译成一个字段加上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 } 

C / C ++用户有(void)var; 压制未使用的variables警告。 我刚刚发现你也可以在C#中使用位运算符来抑制未使用的variables警告:

  uint test1 = 12345; test1 |= 0; // test1 is still 12345 bool test2 = true; test2 &= false; // test2 is now false 

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