Soppressione “non è mai usato” e “non è mai assegnato a” avvisi in C #

Ho un file HTTPSystemDefinitions.cs nel progetto C # che fondamentalmente descrive l’ISAPI Windows precedente per il consumo dal codice gestito.

Ciò include l’insieme completo di strutture relative all’ISAPI non tutte o che sono consumate dal codice. Sulla compilazione tutti i membri del campo di queste strutture stanno causando un avvertimento come il seguente: –

Campo di avvertimento ‘UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader’ non è mai assegnato a, e avrà sempre il suo valore predefinito null

o

Avviso Il campo “UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus” non viene mai utilizzato

Possono essere disabilitati con disabilitazione di #pragma warning disable ? In caso affermativo, quali sarebbero i numeri di errore corrispondenti? Se no, c’è qualcos’altro che posso fare? Tieni presente che ho solo ciò che devo fare per questo file, è importante che io veda avvisi come questi provenienti da altri file.

modificare

Struttura di esempio: –

 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 } 

Sì, questi possono essere soppressi.

Normalmente, sono contraria a sopprimere gli avvertimenti, ma in questo caso, le strutture utilizzate per l’interoperabilità in modo assoluto richiedono che alcuni campi siano presenti, anche se non si intende (o possono) usarli, quindi in questo caso penso che dovrebbe essere giustificato .

Normalmente, per sopprimere questi due avvertimenti, è necessario correggere il codice incriminato. Il primo (“… non viene mai usato”) di solito è un odore di codice degli avanzi dalle precedenti versioni del codice. Forse il codice è stato cancellato, ma i campi sono rimasti indietro.

Il secondo è solitamente un odore di codice per i campi utilizzati in modo errato. Ad esempio, potresti scrivere erroneamente il nuovo valore di una proprietà alla proprietà stessa, senza scrivere mai nel campo di supporto.


Per sopprimere gli avvertimenti per ” Campo XYZ non viene mai usato “, lo fai:

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

Per sopprimere gli avvertimenti per ” Campo XYZ non è mai assegnato, e avrà sempre il suo valore predefinito XX “, lo fai:

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

Per trovare personalmente tali numeri di avviso (ad esempio, come ho saputo di usare 0169 e 0649), lo fai:

  • Compilare il codice normalmente, questo aggiungerà alcuni avvisi al proprio elenco di errori in Visual Studio
  • Passare alla finestra di output e generare l’output e cercare gli stessi avvisi
  • Copia il codice di avvertimento a 4 cifre dal messaggio pertinente, che dovrebbe assomigliare a questo:

    C: \ Dev \ VS.NET \ ConsoleApplication19 \ ConsoleApplication19 \ Program.cs (10,28): avviso CS 0649 : il campo “ConsoleApplication19.Program.dwReserved” non viene mai assegnato e avrà sempre il suo valore predefinito 0


Avvertenza : come da commento di @Jon Hanna , forse sono sufficienti alcune avvertenze per questo, per i futuri cercatori di questa domanda e risposta.

  • Innanzitutto, e soprattutto, l’atto di sopprimere un avvertimento è simile a deglutire le pillole per il mal di testa. Certo, potrebbe essere la cosa giusta da fare a volte, ma non è una soluzione completa. A volte, un mal di testa è un sintomo reale che non si dovrebbe mascherare, lo stesso con gli avvertimenti. È sempre meglio provare a trattare gli avvertimenti correggendo la loro causa, invece di rimuoverli ciecamente dall’output della build.
  • Detto questo, se hai bisogno di sopprimere un avvertimento, segui lo schema che ho esposto sopra. La prima riga di codice, #pragma warning disable XYZK , disabilita l’avviso per il resto del file , o almeno finché #pragma warning restore XYZK viene trovato un #pragma warning restore XYZK corrispondente a #pragma warning restore XYZK . Riduci a icona il numero di linee su cui disabiliti questi avvisi. Il modello sopra distriggers l’avviso per una sola riga.
  • Inoltre, come fa notare Jon, un commento sul motivo per cui lo stai facendo è una buona idea. Disabilitare un avviso è sicuramente un odore di codice quando viene fatto senza causa, e un commento impedirà ai futuri manutentori di passare il tempo a chiedersi perché l’hai fatto, o anche rimuovendolo e cercando di correggere gli avvertimenti.

Un’altra “soluzione” per correggere questi avvertimenti è rendere public la struttura. Gli avvertimenti non vengono emessi perché il compilatore non può sapere se i campi vengono utilizzati (assegnati) al di fuori dell’assieme.

Ciò detto, le componenti di “interoperabilità” di solito non dovrebbero essere pubbliche, ma piuttosto internal o private .

Ho ottenuto VS per generare lo scheletro di implementazione per System.ComponentModel.INotifyPropertyChanged e gli eventi sono stati implementati come campi che hanno triggersto gli avvisi CS0067.

In alternativa alla soluzione data nella risposta accettata, ho convertito i campi in proprietà e l’avvertimento è scomparso .

Questo ha senso dal momento che le dichiarazioni di proprietà dello zucchero di syntax sono compilate in un campo più metodi getter e / o setter (aggiungi / rimuovi nel mio caso) che fanno riferimento al campo. Questo soddisfa il compilatore e gli avvertimenti non vengono sollevati:

 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 } 

Gli utenti C / C ++ hanno (void)var; sopprimere gli avvisi sulle variabili non utilizzate. Ho appena scoperto che puoi anche sopprimere gli avvisi di variabili inutilizzate in C # con operatori bit a bit:

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

Entrambe le espressioni non generano avvisi di variabili inutilizzate nei compilatori VS2010 C # 4.0 e Mono 2.10.