Eu tenho um arquivo HTTPSystemDefinitions.cs no projeto C # que basicamente descreve o ISAPI do Windows mais antigo para consumo por código gerenciado.
Isso inclui o conjunto completo de Estruturas relevantes para a ISAPI, não todas ou que são consumidas por código. Na compilação, todos os membros do campo dessas estruturas estão causando um aviso como o seguinte: -
O campo de aviso 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader' nunca é atribuído e sempre terá seu valor padrão nulo
ou
Aviso O campo 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus' nunca é usado
Eles podem ser desativados com #pragma warning disable
? Em caso afirmativo, quais seriam os números de erro correspondentes? Se não, posso fazer mais alguma coisa? Tenha em mente que eu apenas o que fazer para este arquivo, é importante que eu receba avisos como este vindo de outros arquivos.
Editar
Estrutura de exemplo: -
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
}
fonte
[StructLayout(LayoutKind.Sequential)]
deve garantir que o layout da memória está correto (na implementação atual será mesmo sem este atributo, mas AFAIK não é garantido). Se bem me lembro, o compilador C # detecta a presença desse atributo e suprime automaticamente os avisos, pois sabe que os campos devem estar lá para interoperabilidade. (Posso estar errado sobre isso, postando como um comentário em vez de uma resposta).StructLayout
. Parece mais limpo do que suprimir os próprios avisos.Respostas:
Sim, eles podem ser suprimidos.
Normalmente, me oponho a suprimir avisos, mas, neste caso, structs usados para interoperabilidade requerem absolutamente que alguns campos estejam presentes, mesmo que você nunca pretenda (ou possa) usá-los, então, neste caso, acho que deve ser justificado .
Normalmente, para suprimir esses dois avisos, você consertaria o código ofensivo. O primeiro ("... nunca é usado") é geralmente um cheiro de código de sobras de versões anteriores do código. Talvez o código tenha sido excluído, mas os campos deixados para trás.
O segundo é geralmente um cheiro de código para campos usados incorretamente. Por exemplo, você pode escrever incorretamente o novo valor de uma propriedade de volta na própria propriedade, nunca gravando no campo de apoio.
Para suprimir avisos de "O campo XYZ nunca é usado ", faça o seguinte:
Para suprimir avisos para "O campo XYZ nunca é atribuído a e sempre terá seu valor padrão XX ", faça o seguinte:
Para encontrar você mesmo esses números de aviso (ou seja, como eu sabia usar 0169 e 0649), faça o seguinte:
Copie o código de aviso de 4 dígitos da mensagem relevante, que deve ser assim:
Advertência : de acordo com o comentário de @Jon Hanna , talvez alguns avisos sejam necessários para isso, para futuros descobridores desta pergunta e resposta.
#pragma warning disable XYZK
,, desativa o aviso para o resto do arquivo ou pelo menos até que um correspondente#pragma warning restore XYZK
seja encontrado. Minimize o número de linhas em que você desativa esses avisos. O padrão acima desativa o aviso para apenas uma linha.fonte
//exists for interop
em este caso.[StructLayout(LayoutKind.Sequential)]
atributo lida com a interoperabilidade muito melhor de acordo com o comentário de Greg Beech sobre a questão.Outra "solução" para corrigir esses avisos é criar a estrutura
public
. Os avisos não são emitidos porque o compilador não pode saber se os campos estão ou não sendo usados (atribuídos) fora do assembly.Dito isso, os componentes de "interoperabilidade" geralmente não devem ser públicos, mas sim
internal
ouprivate
.fonte
struct
comopublic
é mais provável que seja um erro do que o aviso que estamos tentando mascarar. (Você provavelmente não deve expor desnecessariamente os tipos usados para implementação interna e os tipos com campos públicos provavelmente não pertencem a uma API pública). Apenas para reforçar o seu conselho de que tais tipos devem ser “ao invésinternal
ouprivate
” ;-).JsonConvert.DeserializeObject
e desserializando em uma classe pública que tem apenas todas as propriedades expostas para que eu saiba o que será retornado. Apenas torná-la uma classe pública vazia com todas as strings públicas é um bom código curto e agora não há mais avisos. Talvez usar uma classe dinâmica seja melhor, pois você não precisa declarar explicitamente o que está no array, mas acho que esta será uma boa referência para qualquer pessoa que pretenda usar o objeto.Eu pedi ao VS para gerar o esqueleto de implementação para
System.ComponentModel.INotifyPropertyChanged
e os eventos foram implementados como campos que acionaram os avisos CS0067.Como alternativa à solução dada na resposta aceita , converti os campos em propriedades e o aviso desapareceu .
Isso faz sentido, uma vez que a sintaxe de declaração de propriedade sugar é compilada em um campo mais os métodos getter e / ou setter (adicionar / remover no meu caso) que fazem referência ao campo. Isso satisfaz o compilador e os avisos não são gerados:
fonte
<GetHeader>k__BackingField
, dependendo dos detalhes de implementação do compilador C # usado.Os usuários de C / C ++ devem
(void)var;
suprimir avisos de variáveis não utilizadas. Acabei de descobrir que você também pode suprimir avisos de variáveis não utilizadas em C # com operadores bit a bit:Ambas as expressões não produzem avisos de variáveis não utilizadas nos compiladores VS2010 C # 4.0 e Mono 2.10.
fonte
uint
, mas não para outros tipos, comoException
. Você conhece um truque genérico equivalente ao C / C ++var;
?error.ToString();
para uma variável do tipoException