在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”组件通常不应该公开,而应该是internal
或private
。
我得到了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警告。