J'ai un fichier HTTPSystemDefinitions.cs dans le projet C # qui décrit essentiellement les anciennes fenêtres ISAPI pour la consommation par code managé.
Cela inclut l'ensemble complet des structures pertinentes pour l'ISAPI pas toutes ou qui sont consommées par le code. Lors de la compilation, tous les membres de champ de ces structures provoquent un avertissement comme celui-ci: -
Le champ d'avertissement 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader' n'est jamais assigné à, et aura toujours sa valeur par défaut nulle
ou
Avertissement Le champ 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus' n'est jamais utilisé
Ceux-ci peuvent-ils être désactivés avec #pragma warning disable
? Si tel est le cas, quels seraient les numéros d'erreur correspondants? Sinon, y a-t-il autre chose que je puisse faire? Gardez à l'esprit que je ne sais quoi faire pour ce fichier, il est important que je reçoive des avertissements comme ceux-ci provenant d'autres fichiers.
Éditer
Exemple de structure: -
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
}
la source
[StructLayout(LayoutKind.Sequential)]
assurer que la disposition de la mémoire est correcte (dans l'implémentation actuelle, ce sera même sans cet attribut, mais AFAIK ce n'est pas garanti). Si je me souviens bien, le compilateur C # détecte la présence de cet attribut et supprime automatiquement ces avertissements car il sait que les champs doivent être là pour l'interopérabilité. (Je pourrais me tromper à ce sujet, donc poster comme commentaire au lieu de réponse).StructLayout
. Cela semble plus propre que de supprimer les avertissements eux-mêmes.Réponses:
Oui, ceux-ci peuvent être supprimés.
Normalement, je suis opposé à la suppression des avertissements, mais dans ce cas, les structures utilisées pour l'interopérabilité nécessitent absolument la présence de certains champs, même si vous n'avez jamais l'intention de (ou ne pouvez) les utiliser, donc dans ce cas, je pense que cela devrait être justifié .
Normalement, pour supprimer ces deux avertissements, vous corrigeriez le code incriminé. Le premier ("... n'est jamais utilisé") est généralement une odeur de code des restes de versions antérieures du code. Peut-être que le code a été supprimé, mais les champs sont laissés pour compte.
Le second est généralement une odeur de code pour les champs mal utilisés. Par exemple, vous pourriez écrire de manière incorrecte la nouvelle valeur d'une propriété dans la propriété elle-même, sans jamais écrire dans le champ de sauvegarde.
Pour supprimer les avertissements pour "Le champ XYZ n'est jamais utilisé ", procédez comme suit:
Pour supprimer les avertissements pour "Le champ XYZ n'est jamais attribué à et aura toujours sa valeur par défaut XX ", procédez comme suit:
Pour trouver vous-même de tels numéros d'avertissement (c'est-à-dire comment ai-je su utiliser 0169 et 0649), procédez comme suit:
Copiez le code d'avertissement à 4 chiffres du message correspondant, qui devrait ressembler à ceci:
Avertissement : selon le commentaire de @Jon Hanna , quelques avertissements sont peut-être nécessaires pour cela, pour les futurs chercheurs de cette question et réponse.
#pragma warning disable XYZK
,, désactive l'avertissement pour le reste de ce fichier , ou du moins jusqu'à ce qu'un correspondant#pragma warning restore XYZK
soit trouvé. Réduisez le nombre de lignes sur lesquelles vous désactivez ces avertissements. Le modèle ci-dessus désactive l'avertissement pour une seule ligne.la source
//exists for interop
dans ce cas.[StructLayout(LayoutKind.Sequential)]
attribut gère beaucoup mieux l'interopérabilité, selon le commentaire de Greg Beech sur la question.Une autre «solution» pour corriger ces avertissements consiste à créer la structure
public
. Les avertissements ne sont pas émis alors car le compilateur ne peut pas savoir si les champs sont utilisés (affectés) en dehors de l'assembly.Cela dit, les composants «interop» ne devraient généralement pas être publics, mais plutôt
internal
ouprivate
.la source
struct
commepublic
est d'être une erreur plus probable que la mise en garde que nous essayons de masquer. (Vous ne devriez probablement pas exposer inutilement les types utilisés pour l'implémentation interne et les types avec des champs publics n'appartiennent probablement pas à une API publique). Juste pour renforcer votre avis que ces types devraient être «plutôtinternal
ouprivate
» ;-).JsonConvert.DeserializeObject
et je désérialise dans une classe publique qui a juste toutes les propriétés exposées afin que je sache ce qui sera retourné. Le simple fait d'en faire une classe publique vide avec toutes les chaînes publiques est un bon code court et maintenant plus d'avertissements. Peut-être que l'utilisation d'une classe dynamique serait mieux car vous n'avez pas à indiquer explicitement ce qu'il y a dans le tableau, mais je pense que ce sera une bonne référence pour quiconque espère utiliser l'objet.J'ai demandé à VS de générer le squelette d'implémentation pour
System.ComponentModel.INotifyPropertyChanged
et les événements ont été implémentés en tant que champs qui ont déclenché les avertissements CS0067.Comme alternative à la solution donnée dans la réponse acceptée, j'ai converti les champs en propriétés et l'avertissement a disparu .
Cela a du sens puisque la syntaxe des déclarations de propriété Sugar est compilée dans un champ plus des méthodes getter et / ou setter (ajouter / supprimer dans mon cas) qui référencent le champ. Cela satisfait le compilateur et les avertissements ne sont pas déclenchés:
la source
<GetHeader>k__BackingField
, selon les détails d'implémentation du compilateur C # utilisé.Les utilisateurs C / C ++ doivent
(void)var;
supprimer les avertissements de variables inutilisées. Je viens de découvrir que vous pouvez également supprimer les avertissements de variables inutilisées en C # avec des opérateurs au niveau du bit:Les deux expressions ne produisent pas d'avertissements de variables inutilisées dans les compilateurs VS2010 C # 4.0 et Mono 2.10.
la source
uint
, mais pas pour les autres types, commeException
. Connaissez-vous une astuce générique équivalente au C / C ++var;
?error.ToString();
pour une variable de typeException