2009-10-08 3 views
0

J'ai une instruction IF qui valide les données.Prioriser la section de l'instruction IF

ressemble fondamentalement ceci:

Dim s As String = Nothing 

If s Is Nothing Or s.Length = 0 Then 
    Console.WriteLine("Please enter a value") 
End If 

Console.Read() 

Je voudrais vérifier s'il n'y a rien d'abord parce que si je l'écris cette façon, il jette un NullReferenceException.

J'ai pensé réécrivant comme ceci:

If s Is Nothing Then 
    Console.WriteLine("Please enter a value") 
ElseIf s.Length = 0 Then 
    Console.WriteLine("Please enter a value") 
End If 

Mais si je fais cela, j'ai le même message deux fois et je crois qu'il est moins clair que mon intention erreur.

J'ai également essayé de lancer une parenthèse autour de la clause Is Nothing, mais cela ne fonctionne pas.

Y at-il un élégant quoi tester si l'objet n'est rien et ensuite tester une propriété de celui-ci?

Répondre

7

.NET 2.0 a introduit le mot-clé OrElse pour effectuer un court-circuit. Ce que cela signifie est qu'il n'évaluera pas le côté droit du OrElse si le côté gauche est vrai. A part cela, cela fonctionne exactement comme Or.

L'équivalent And est AndAlso, ce qui n'évaluera pas le côté droit si le côté gauche est faux.

devrait faire ce que vous voulez.

+0

vrai. Toutefois, cela n'explique pas pourquoi son second code renvoie également une exception NullReference. Dans l'ignorance de ce mot clé, son deuxième code devrait être une solution de contournement valide. –

+0

@Daniel Daranas: Hmm, c'est vrai. Je suppose que je ne peux tout simplement pas enrouler ma tête Est-ce que rien ne retourne une exception NullReferenceException. – Powerlord

+0

Oups Je pense que j'ai mal compris ce que le PO a dit. Il dit qu'il "reçoit le même message d'erreur deux fois", se référant probablement à "S'il vous plaît entrer une valeur". –

4

vous pouvez utiliser:

if (string.IsNullOrEmpty(s)) 
{ 
//do work 
} 
+0

Je n'ai pas pensé à ça. Bonne prise. – Powerlord

+0

ouais c'est une bonne méthode qui rend le code plus propre ... et bien sûr ne va fonctionner que pour la chaîne .... – CSharpAtl

+0

@CSharpAtl: Vrai, mais il exprime l'intention plus clairement, et vérifie si c'est une chaîne. Vide pour démarrer. – Powerlord

Questions connexes