La suppression de “n'est jamais utilisé” et “n'est jamais attribué à la section” avertissements en C#
J'ai un HTTPSystemDefinitions.cs fichier en C# du projet qui décrit les plus anciennes de windows ISAPI pour la consommation en code managé.
Cela comprend l'ensemble des Structures pertinentes à l'ISAPI pas tous ou qui sont consommées par le code. Sur la compilation de tous les membres de ces structures sont à l'origine d'un avertissement comme suit:-
De La Zone D'Alerte 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.SetHeader " n'est jamais affecté, et aura toujours sa valeur par défaut null
ou
Avertissement Le champ 'UnionSquare.ISAPI.HTTP_FILTER_PREPROC_HEADERS.HttpStatus " n'est jamais utilisé
Peuvent-ils être désactivé avec #pragma warning disable
? Si oui, quelle serait l'erreur correspondante des numéros? Si non, est-il autre chose que je peux faire? Gardez à l'esprit, je n'ai que faire de ce fichier, il est important que je reçois voir mises en garde comme ces provenant d'autres fichiers.
Modifier
Exemple struct:-
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
}
- Pouvez-vous montrer à la déclaration de ces champs, ou plutôt, la structure qu'ils sont dans? c'est à dire. donner un exemple.
- Exemple ajouté.
- Si ce sont des interop définitions, puis, normalement, vous auriez mis
[StructLayout(LayoutKind.Sequential)]
pour assurer la disposition de la mémoire est correcte (dans l'implémentation actuelle, il sera même sans cet attribut, mais autant que je sache, il n'est pas garanti). Si je me souviens bien, le compilateur C# détecte la présence de cet attribut et supprime automatiquement ces mises en garde qu'il sait champs doivent être là pour l'interopérabilité. (Je peux me tromper à ce sujet, donc de poster un commentaire à la place d'une réponse). - C'est utile info je vais étudier je préfère l'avertissement de ne pas être généré plutôt que de les supprimer.
- +1 pour l'utilisation de
StructLayout
. Il semble plus propre que de supprimer les mises en garde eux-mêmes. - Vous avez raison! Cela s'applique toujours pour .NET Standard projets sur VS2017.
Vous devez vous connecter pour publier un commentaire.
Oui, ce peut être supprimée.
Normalement, je suis opposé à la suppression des avertissements, mais dans ce cas, les structures utilisées pour l'interopérabilité nécessite absolument certains champs à présent, même si vous ne pensez pas (ou pouvez) utiliser, dans ce cas, je pense qu'il doit être justifiée.
Normalement, pour supprimer ces deux avertissements, vous de corriger le code incriminé. La première ("... n'est jamais utilisé") est généralement un code-l'odeur des restes de table à partir de versions antérieures du code. Peut-être que le code a été supprimé, mais les champs à gauche derrière.
La seconde est généralement un code-odeur pour incorrectement utilisé champs. Par exemple, vous pourriez mal écrit la nouvelle valeur d'une propriété à la propriété elle-même, jamais écrit à l'endos de champ.
Pour supprimer les avertissements pour "Domaine XYZ n'est jamais utilisé", tu fais ceci:
Pour supprimer les avertissements pour "Domaine XYZ n'est jamais affecté, et aura toujours sa valeur par défaut XX", tu fais ceci:
De trouver un tel avertissement numéros de soi-même (ex. comment ai-je appris à utiliser 0169 et 0649), pour ce faire:
Copier les 4 chiffres d'avertissement code du message, qui devrait ressembler à ceci:
Mise en garde: Comme par le commentaire par @Jon Hanna, peut-être un peu d'avertissement est dans l'ordre pour cette, pour les futurs inventeurs de cette question et la réponse.
#pragma warning disable XYZK
, désactive l'avertissement pour le reste de fichier, ou au moins jusqu'à ce qu'un correspondant#pragma warning restore XYZK
est trouvé. Minimiser le nombre de lignes de désactiver ces mises en garde sur les. Le schéma ci-dessus désactive l'avertissement pour une seule ligne.//exists for interop
dans ce cas.[StructLayout(LayoutKind.Sequential)]
attribut poignées interop beaucoup mieux que par Greg Hêtre commentaire sur la question.catch (Exception ex)
, où vous n'utilisez pasex
, puis il suffit de supprimerex
. Pouvez-vous expliquer exactement ce que tu voulais dire @Zimano?ex
danscatch (Exception ex)
. Bien sûr, il doit être supprimé dans ce cas, mais néanmoins je m'attends à encore réduire l'avertissement!#pragma warning disable 0168
en fait de supprimer cet avertissement, vous assurer que vous utilisez la bonne CSxxxx nombre?Une autre "solution" pour corriger ces avertissements est par la mise struct
public
. Les avertissements ne sont pas émis ensuite parce que le compilateur ne peut pas savoir si oui ou non les champs sont utilisés (attribué) à l'extérieur de l'assemblée.Cela dit, "l'interopérabilité" des composants ne devraient généralement pas être public, mais plutôt
internal
ouprivate
.struct
commepublic
est plus susceptible d'être une erreur que l'avertissement que nous essayons de masque. (Vous ne devriez probablement pas être inutilement exposer des types utilisés pour la mise en œuvre interne et avec des types de champs publics, probablement, n'appartiennent pas à une API publique). Juste pour renforcer vos conseils que ces types de doit être “plutôtinternal
ouprivate
” ;-).J'ai eu VS pour générer le squelette d'implémentation de
System.ComponentModel.INotifyPropertyChanged
et les événements ont été mis en œuvre en tant que champs, ce qui a déclenché la CS0067 avertissements.Comme une alternative à la solution donnée dans la accepté de répondre à j'ai converti les champs dans les propriétés et l'avertissement disparu.
Ce sens puisque les déclarations de propriété de la syntaxe de sucre sont compilés dans un champ plus getter et/ou des méthodes de définition (ajouter/supprimer dans mon cas) qui font référence au champ. Cela satisfait le compilateur et les avertissements ne sont pas élevés:
<GetHeader>k__BackingField
, selon les détails de l'implémentation du compilateur C# utilisé.C/C++ utilisateurs ont
(void)var;
pour supprimer les variables mises en garde.Je viens de découvrir que vous pouvez également supprimer les variables mises en garde en C# avec les opérateurs au niveau du bit:
Les deux expressions ne produisent pas de inutilisés de la variable de mises en garde dans VS2010 C# 4.0 et Mono 2.10 compilateurs.
uint
, mais pas pour les autres types, commeException
. Connaissez-vous un truc générique équivalent au C/C++var;
?error.ToString();
pour une variable de typeException