Tengo un archivo HTTPSystemDefinitions.cs en el proyecto C # que básicamente describe el ISAPI de Windows más antiguo para el consumo mediante código administrado.
Esto incluye el conjunto completo de estructuras relevantes para la ISAPI, no todas o que son consumidas por código. En la compilación, todos los miembros de campo de estas estructuras están provocando una advertencia como la siguiente:
El campo de advertencia 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader' nunca se asigna y siempre tendrá su valor predeterminado nulo
o
Advertencia El campo 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus' nunca se usa
¿Se pueden desactivar con #pragma warning disable
? Si es así, ¿cuáles serían los números de error correspondientes? Si no, ¿hay algo más que pueda hacer? Tenga en cuenta que solo sé qué hacer con este archivo, es importante que vea advertencias como estas provenientes de otros archivos.
Editar
Estructura de ejemplo: -
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
}
fuente
[StructLayout(LayoutKind.Sequential)]
para asegurarse de que el diseño de la memoria sea correcto (en la implementación actual será incluso sin este atributo, pero AFAIK no está garantizado). Si no recuerdo mal, el compilador de C # detecta la presencia de este atributo y suprime automáticamente esas advertencias, ya que sabe que los campos deben estar allí para la interoperabilidad. (Podría estar equivocado sobre esto, por lo tanto, publicar como un comentario en lugar de una respuesta).StructLayout
. Parece más limpio que suprimir las propias advertencias.Respuestas:
Sí, estos se pueden suprimir.
Normalmente, me opongo a suprimir las advertencias, pero en este caso, las estructuras utilizadas para la interoperabilidad requieren absolutamente que algunos campos estén presentes, aunque nunca tenga la intención (o pueda) usarlos, por lo que en este caso creo que debería estar justificado .
Normalmente, para suprimir esas dos advertencias, debería corregir el código ofensivo. El primero ("... nunca se usa") suele ser un olor a código de restos de versiones anteriores del código. Quizás se eliminó el código, pero los campos se dejaron atrás.
El segundo suele ser un olor a código para campos usados incorrectamente. Por ejemplo, podría escribir incorrectamente el nuevo valor de una propiedad en la propiedad misma, sin escribir nunca en el campo de respaldo.
Para suprimir las advertencias de "El campo XYZ nunca se utiliza ", haga lo siguiente:
Para suprimir las advertencias para "El campo XYZ nunca está asignado y siempre tendrá su valor predeterminado XX ", haga lo siguiente:
Para encontrar esos números de advertencia usted mismo (es decir, ¿cómo supe usar 0169 y 0649), haga esto:
Copie el código de advertencia de 4 dígitos del mensaje correspondiente, que debería verse así:
Advertencia : según el comentario de @Jon Hanna , tal vez algunas advertencias sean necesarias para esto, para los futuros buscadores de esta pregunta y respuesta.
#pragma warning disable XYZK
, desactiva la advertencia para el resto de ese archivo , o al menos hasta que#pragma warning restore XYZK
se encuentre el correspondiente . Minimice la cantidad de líneas en las que deshabilita estas advertencias. El patrón anterior deshabilita la advertencia para una sola línea.fuente
//exists for interop
en este caso.[StructLayout(LayoutKind.Sequential)]
atributo maneja la interoperabilidad mucho mejor según el comentario de Greg Beech sobre la pregunta.Otra "solución" para corregir estas advertencias es crear la estructura
public
. Las advertencias no se emiten entonces porque el compilador no puede saber si los campos se están usando (asignados) fuera del ensamblado.Dicho esto, los componentes de "interoperabilidad" normalmente no deberían ser públicos, sino
internal
oprivate
.fuente
struct
comopublic
es más probable que sea un error que la advertencia que estamos tratando de enmascarar. (Probablemente no debería exponer innecesariamente los tipos utilizados para la implementación interna y los tipos con campos públicos probablemente no pertenezcan a una API pública). Solo para reforzar su consejo de que esos tipos deberían ser "más bieninternal
oprivate
" ;-).JsonConvert.DeserializeObject
y estoy deserializando en una clase pública que solo tiene todas las propiedades expuestas para saber qué se devolverá. Convertirlo en una clase pública que esté vacía con todas las cadenas públicas es un código corto agradable y ahora no hay más advertencias. Tal vez sea mejor usar una clase dinámica ya que no tiene que indicar explícitamente qué hay en la matriz, pero creo que esta será una buena referencia para cualquiera que desee usar el objeto.Conseguí que VS generara el esqueleto de implementación
System.ComponentModel.INotifyPropertyChanged
y los eventos se implementaron como campos que desencadenaron las advertencias CS0067.Como alternativa a la solución dada en la respuesta aceptada , convertí los campos en propiedades y la advertencia desapareció .
Esto tiene sentido ya que la sintaxis de declaraciones de propiedad sugar se compila en un campo más métodos getter y / o setter (agregar / eliminar en mi caso) que hacen referencia al campo. Esto satisface al compilador y las advertencias no se generan:
fuente
<GetHeader>k__BackingField
, según los detalles de implementación del compilador de C # utilizado.Los usuarios de C / C ++ deben
(void)var;
suprimir las advertencias de variables no utilizadas. Acabo de descubrir que también puede suprimir las advertencias de variables no utilizadas en C # con operadores bit a bit:Ambas expresiones no producen advertencias de variables no utilizadas en los compiladores VS2010 C # 4.0 y Mono 2.10.
fuente
uint
otros tipos, pero no paraException
. ¿Conoces un truco genérico equivalente al C / C ++var;
?error.ToString();
para una variable de tipoException