我在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
}
答案 0 :(得分:184)
是的,可以抑制这些。
通常,我反对压制警告,但在这种情况下,用于互操作的结构绝对需要一些字段存在,即使你从未打算(或可以)使用它们,所以在这种情况下我认为它应该是合理的。
通常,要取消这两个警告,您可以修复有问题的代码。第一个(“......从未使用过”)通常是代码早期版本的剩余代码味道。也许代码被删除了,但是遗留下来的字段。
第二种通常是错误使用字段的代码气味。例如,您可能会错误地将属性的新值写回属性本身,从不写入支持字段。
要取消“永远不会使用字段XYZ ”的警告,请执行以下操作:
#pragma warning disable 0169
... field declaration
#pragma warning restore 0169
要取消警告“字段永远不会分配XYZ,并且始终具有默认值XX ”,请执行以下操作:
#pragma warning disable 0649
... field declaration
#pragma warning restore 0649
要自己找到这样的警告号码(即我怎么知道使用0169和0649),你可以这样做:
从相关消息中复制4位数的警告代码,如下所示:
C:\开发\ VS.NET \ ConsoleApplication19 \ ConsoleApplication19 \ Program.cs的(10,28): 警告CS 0649 :字段'ConsoleApplication19.Program.dwReserved'永远不会 分配给,并且将始终具有其默认值0
警告:根据@Jon Hanna的评论,或许有一些警告是为了这个,为此问答的未来发现者。
#pragma warning disable XYZK
会禁用该文件其余部分的警告,或者至少在找到相应的#pragma warning restore XYZK
之前。最小化禁用这些警告的行数。上面的模式仅禁用一行警告。答案 1 :(得分:12)
修复这些警告的另一个“解决方案”是制作结构public
。然后不会发出警告,因为编译器无法知道在程序集之外是否正在使用(分配)字段。
那就是说,“互操作”组件通常不应该是公开的,而是internal
或private
。
答案 2 :(得分:5)
我让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
}
答案 3 :(得分: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编译器中产生未使用的变量警告。