Ich habe eine HTTPSystemDefinitions.cs-Datei im C # -Projekt, die im Grunde die älteren Windows-ISAPI für den Verbrauch durch verwalteten Code beschreibt.
Dies umfasst den vollständigen Satz von Strukturen, die für die ISAPI relevant sind, nicht alle oder die vom Code verbraucht werden. Bei der Kompilierung verursachen alle Feldmitglieder dieser Strukturen eine Warnung wie die folgende: -
Das Warnfeld 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader' wird niemals zugewiesen und hat immer den Standardwert null
oder
Warnung Das Feld 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus' wird niemals verwendet
Können diese mit deaktiviert werden #pragma warning disable
? Wenn ja, wie lauten die entsprechenden Fehlernummern? Wenn nicht, kann ich noch etwas tun? Denken Sie daran, dass ich nur weiß, was ich für diese Datei tun soll. Es ist wichtig, dass ich Warnungen wie diese aus anderen Dateien sehe.
Bearbeiten
Beispielstruktur: -
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
}
quelle
[StructLayout(LayoutKind.Sequential)]
sicherstellen, dass das Speicherlayout korrekt ist (in der aktuellen Implementierung ist es sogar ohne dieses Attribut, aber AFAIK ist nicht garantiert). Wenn ich mich richtig erinnere, erkennt der C # -Compiler das Vorhandensein dieses Attributs und unterdrückt diese Warnungen automatisch, da er weiß, dass Felder für die Interop vorhanden sein müssen. (Ich könnte mich irren und daher als Kommentar statt als Antwort posten).StructLayout
. Es scheint sauberer zu sein, als die Warnungen selbst zu unterdrücken.Antworten:
Ja, diese können unterdrückt werden.
Normalerweise bin ich gegen die Unterdrückung von Warnungen, aber in diesem Fall müssen für Interop-Strukturen unbedingt einige Felder vorhanden sein, auch wenn Sie diese niemals verwenden möchten (oder können). In diesem Fall sollte dies meiner Meinung nach gerechtfertigt sein .
Um diese beiden Warnungen zu unterdrücken, würden Sie normalerweise den fehlerhaften Code korrigieren. Das erste ("... wird nie verwendet") ist normalerweise ein Code-Geruch von Resten aus früheren Versionen des Codes. Möglicherweise wurde Code gelöscht, aber Felder zurückgelassen.
Der zweite ist normalerweise ein Code-Geruch für falsch verwendete Felder. Beispielsweise können Sie den neuen Wert einer Eigenschaft fälschlicherweise in die Eigenschaft selbst zurückschreiben und niemals in das Hintergrundfeld schreiben.
Gehen Sie folgendermaßen vor, um Warnungen für " Feld XYZ wird niemals verwendet " zu unterdrücken :
Um Warnungen für " Feld XYZ ist niemals zugewiesen und hat immer den Standardwert XX " zu unterdrücken , gehen Sie folgendermaßen vor:
Um solche Warnnummern selbst zu finden (dh woher wusste ich, dass 0169 und 0649 verwendet werden), gehen Sie folgendermaßen vor:
Kopieren Sie den 4-stelligen Warncode aus der entsprechenden Nachricht, die folgendermaßen aussehen sollte:
Vorsichtsmaßnahme : Laut dem Kommentar von @Jon Hanna sind möglicherweise einige Warnungen angebracht, damit zukünftige Finder dieser Frage und Antwort.
#pragma warning disable XYZK
deaktiviert die Warnung für den Rest dieser Datei oder zumindest bis eine entsprechende#pragma warning restore XYZK
gefunden wird. Minimieren Sie die Anzahl der Zeilen, in denen Sie diese Warnungen deaktivieren. Das obige Muster deaktiviert die Warnung für nur eine Zeile.quelle
//exists for interop
in dieser Fall.[StructLayout(LayoutKind.Sequential)]
Attribut handhabt Interop viel besser als in Greg Beechs Kommentar zu der Frage.Eine andere "Lösung", um diese Warnungen zu beheben, besteht darin, die Struktur zu erstellen
public
. Die Warnungen werden dann nicht ausgegeben, da der Compiler nicht wissen kann, ob die Felder außerhalb der Assembly verwendet (zugewiesen) werden.Das heißt, "Interop" -Komponenten sollten normalerweise nicht öffentlich sein, sondern
internal
oderprivate
.quelle
struct
wiepublic
wahrscheinlicher ist ein Fehler , als die Warnung, die wir zu verschleiern versuchen. (Sie sollten wahrscheinlich nicht unnötig Typen verfügbar machen, die für die interne Implementierung verwendet werden, und Typen mit öffentlichen Feldern gehören wahrscheinlich nicht in eine öffentliche API.) Nur um Ihren Rat zu bekräftigen, dass solche Typen "eherinternal
oderprivate
" sein sollten ;-).JsonConvert.DeserializeObject
und deserialisiere in eine öffentliche Klasse, in der nur alle Eigenschaften verfügbar sind, damit ich weiß, was zurückgegeben wird. Nur eine öffentliche Klasse zu machen, die mit allen öffentlichen Zeichenfolgen leer ist, ist ein netter Funktionscode und jetzt keine Warnungen mehr. Vielleicht wäre die Verwendung einer dynamischen Klasse besser, da Sie nicht explizit angeben müssen, was sich im Array befindet, aber ich denke, dies ist eine gute Referenz für alle, die das Objekt verwenden möchten.Ich habe VS beauftragt, das Implementierungsskelett für zu generieren,
System.ComponentModel.INotifyPropertyChanged
und die Ereignisse wurden als Felder implementiert, die die CS0067-Warnungen auslösten.Als Alternative zu der in der akzeptierten Antwort angegebenen Lösung habe ich die Felder in Eigenschaften konvertiert und die Warnung ist verschwunden .
Dies ist sinnvoll, da die Syntaxzucker für Eigenschaftsdeklarationen in ein Feld plus Getter- und / oder Setter-Methoden (in meinem Fall Hinzufügen / Entfernen) kompiliert werden, die auf das Feld verweisen. Dies erfüllt den Compiler und die Warnungen werden nicht ausgegeben:
quelle
<GetHeader>k__BackingField
abhängig von den Implementierungsdetails des verwendeten C # -Compilers.C / C ++ - Benutzer müssen
(void)var;
Warnungen vor nicht verwendeten Variablen unterdrücken. Ich habe gerade festgestellt, dass Sie Warnungen für nicht verwendete Variablen in C # auch mit bitweisen Operatoren unterdrücken können:Beide Ausdrücke erzeugen in VS2010 C # 4.0- und Mono 2.10-Compilern keine nicht verwendeten Variablenwarnungen.
quelle
uint
, aber nicht für andere Typen, wieException
. Kennen Sie einen generischen Trick, der C / C ++ entsprichtvar;
?error.ToString();
für eine Variable vom Typ verwendenException