2009-11-02 7 views
3

J'ai obtenu un code similaire à ceci:Puis-je ignorer en toute sécurité CodeAnalysis warning: remplacer string == "" par string.IsNullOrEmpty?

string s = CreateString(); 
if (s == "") foo(s); 

Si s est égal à "" devrait être appelé foo. Si la chaîne est nulle, ce qui ne devrait jamais arriver, alors une exception NullReferenceException est bonne (car c'est, après tout, une situation exceptionnelle). CodeAnalyse me dit de tester pour s.IsNullOrEmpty.

Cela modifierait la fonctionnalité de manière non intentionnelle.

Les performances ne sont pas un problème.

Est-il sécuritaire de supprimer l'avertissement CA1820 associé?

Éditer: Échantillon de code mis à jour et texte pour mieux refléter mon cas.

Edit: Ce est le (légèrement modifié) code réel (il est dans une implémentation standard IXmlSerializable):

public void ReadXml (XmlReader reader) 
    // ... 
    string img = reader.ReadElementString ("Image"); 
    if (img != "") { 
     Image = Image.FromFile(img); 
    } 
    // ... 

Répondre

4

Il se comportera différemment en ce qui concerne les valeurs nulles, donc cela dépend de ce que vous vouloir arriver; vous mentionnez que NullReferenceException serait OK, mais il n'y a rien dans le code cité qui soulèverait cela, d'où la raison pour laquelle il pourrait causer des erreurs inattendues en aval.

Je ne ont, mais je suis toujours tenté d'ajouter:

static bool IsNullOrEmpty(this string value) { 
    return string.IsNullOrEmpty(value); 
} 

donc je peux utiliser:

if (s.IsNullOrEmpty()) foo(); 
+0

Il vous manque un "ceci" à l'intérieur de la parenthèse pour faire de la méthode une extension;) De toute façon je l'ai utilisé depuis longtemps maintenant ... il se lit beaucoup mieux. – em70

+0

J'ai déjà ajouté le "this" manquant dans un "oups je suis un muppet" edit ;-p –

+0

Vous Britanniques et vos aphorismes. Ça me donne envie de déménager au Royaume-Uni. – tvanfosson

0

Si null est OK, vous serez bien de toute façon.

0

oui.

Mais je serais d'accord avec CodeAnalysis avec string.IsnullOrEmpty est un choix sûr.

1

Il serait préférable d'écrire le test:

if(s != null && s == "") 

Vous pouvez ensuite traiter une valeur nulle dans une autre instruction if

+0

L'ajout d'un test supplémentaire pour null a effectivement du sens et supprime l'avertissement. Une idée simple mais bonne. – mafu

2

avertissement Chaque analyse du code a la documentation associée que vous pouvez accéder par en surlignant l'avertissement et en appuyant sur F1. Vous pouvez également cliquer avec le bouton droit sur l'élément pour obtenir de l'aide.

Dans tous les cas, voici le documentation that explains that particular warning. Selon cette documentation, il est "prudent de supprimer un avertissement de cette règle si la performance n'est pas un problème".

0

Ne pas gérer les exceptions alors que vous pouvez être génériquement une mauvaise idée, alors CA a raison de dire que vous devez traiter null comme vide ou gérer l'exception. Une exception de référence nulle provoquée par l'utilisation d'une valeur de retour est une très mauvaise chose. Au moins mettre dans un Debug.Assert (s! = Null) et comparer à la chaîne.Vide

+0

Ma compréhension de la question est que la méthode ne retourne jamais null. Dans ce cas, il s'agirait d'une condition exceptionnelle et d'accord avec l'exception. Oui, c'est une mauvaise chose, mais selon son code, cela ne devrait jamais arriver. – tvanfosson

1

Vous n'ignorez pas vraiment l'avertissement, vous avez examiné le code et décidé que l'avertissement ne s'applique pas. C'est une condition parfaitement raisonnable pour supprimer l'avertissement.

que pure spéculation

Je voudrais savoir un peu plus sur ce que vous essayez de faire, cependant. Je soupçonne qu'il pourrait y avoir une meilleure façon de le gérer. Le motif me rappelle retourner un message d'erreur ou vide pour signaler le succès d'une méthode. Si c'est le cas, je considèrerais renvoyer void et lancer une exception en cas d'échec ou retourner bool et seulement lancer des exceptions lorsque le message est critique et retourner vrai/faux sinon.

+0

Je posterai le code actuel. – mafu

3

Spécifications:

Si s est égal à "" devrait être appelé foo. Si la chaîne est nulle, ce qui ne devrait jamais se produire, alors une exception NullReferenceException est correcte.

Juste test the string length as adviced in the CodeAnalysis rule:

if (s.Length == 0) foo(s); 

Votre question:

Est-il sûr de supprimer l'associé avertissement CA1820?

Vous pouvez l'ignorer, votre code ne fonctionnera mais je ne le conseille, suivre autant les directives que vous pouvez. Même si le sujet (performance) n'est pas un problème, votre code sera plus cohérent et vous vous habituerez à écrire du code standard.