2010-05-06 4 views
0

En C#, pouvez-vous utiliser un prédicat booléen en tant que paramètre pour une instruction if?C#: pouvez-vous utiliser un prédicat booléen comme paramètre d'une instruction if?

par exemple:

string str = "HELLO"; 
if (str.Equals("HELLO")) 
{ 
    Console.WriteLine("HELLO"); 
} 

Est-ce que cette sortie de code "BONJOUR", ou at-il besoin d'être:

string str = "HELLO"; 
if (str.Equals("HELLO") == true) 
{ 
    Console.WriteLine("HELLO"); 
} 

S'il y a quelque chose de mal avec les segments de code ci-dessus, s'il vous plaît pointer en dehors.

EDIT: doubles égaux que par des réponses

+10

Plutôt que de poser une question ici, ne serait-il pas été plus rapide et plus simple d'essayer ces deux extraits dans votre compilateur? – user200783

+0

J'ai quelque chose que je crois logiquement équivalent dans mon code mais il ne s'exécute pas selon les réponses ici. Je ne sais pas ce qui ne va pas. – CJ7

+0

N'oubliez pas que lorsque vous comparez des cordes, BONJOUR et salut ne sont pas les mêmes - le cas est important. – NibblyPig

Répondre

2

Oui, vous pouvez.

(Votre deuxième exemple nécessite 2 = (c'est-à-dire ==) pour être correct).

+0

C'est la réponse choisie parce qu'elle était la plus ancienne. – CJ7

4

Eh bien, ce dernier extrait ne sera même pas compiler parce qu'il essaie de attribuertrue à str.Equals("Hello") (vous avez un seul = au lieu de ==) mais soit :

if (str.Equals("HELLO")) 

ou

if (str.Equals("HELLO") == true) 

fonctionnera. Ce dernier est assez fortement découragé cependant - c'est plutôt moche.

Gardez à l'esprit que la chaîne == surchargent, donc vous pouvez réellement écrire:

if (str == "HELLO") 

qui est un peu plus simple.

+1

Juste pour développer un peu la réponse de Jon, l'instruction if fonctionnera avec n'importe quelle expression qui évalue un résultat booléen. – Lazarus

+0

Si je rencontre des résultats contraires à cette réponse, qu'est-ce qui pourrait mal tourner? Pourrait-il y avoir un problème avec les caractères de fin de chaîne ou autre chose? – CJ7

+0

vous pouvez toujours essayer str.Trim() == "BONJOUR" pour vous assurer que les espaces sont supprimés du début et de la fin de votre chaîne. – derek

3

La deuxième version ne compilera même pas, puisque vous avez besoin de ==, et non de =.

Voir code comme if (foo == true) fait monter la bile dans ma bouche.

+0

Si 'foo' est un booléen nullable,' foo == true' est une option valide. – Jens

+1

(foo == true! = False) évalue au même résultat, mais vos collègues développeurs ne vous inviteront plus à leurs parties. – Jono

+0

Jens, je n'ai jamais dit que c'était invalide. –

2

Le code que vous avez est correct, l'instruction if vérifie si l'instruction entre parenthèses est vraie.

Rappelez-vous que les comparaisons en C# utilisation == pas =, il devrait donc être if (x == true)

Ceci peut être utilisé dans d'autres situations telles que:

bool isACat = true; 

if (isACat) 
{ 
} 

Il est bon de mettre est ou un identifiant similaire (Is/has/devrait/Will/Do/Must ...) avant les noms de variables booléennes, car il est facile à lire lorsque vous n'utilisez pas == true.

+1

Vous n'avez pas toujours besoin d'un préfixe 'is'. Tout ce qui peut être sémantiquement «oui» ou «non» est approprié. –

+0

Vous n'en avez pas besoin, mais c'est une bonne pratique, plutôt que d'avoir (cat) – NibblyPig

+0

@SLC: Je veux dire qu'il existe d'autres noms d'identifiants sémantiquement corrects qui n'ont pas de préfixe 'is'. Par exemple, 'hasSomeProperty', ou toute paire verbe-nom où le verbe est à la troisième personne simple présent (par opposition à impératif, pour les noms de méthodes). Je suppose que les noms plus compliqués ne fonctionnent vraiment que pour les propriétés de l'objet, quand il y a un sujet clair. –

2

pouvez-vous utiliser un prédicat booléen sur son propre comme paramètre pour une instruction if

à proprement parler, la réponse à cette est « non », car un prédicatest un fonction (au sens mathématique).Qu'est-ce que vous pouvez utiliser pour l'expression conditionnelle dans un if est une expression booléenne, y compris (comme ici), le résultat de l'invocation d'un prédicat sur une valeur.

Pour développer, le 'prédicat' est ici égal à 'HELLO'. C'est une fonction (au sens mathématique) qui fonctionne sur des valeurs de type string et renvoie des valeurs booléennes. Une fois que vous avez obtenu une valeur booléenne (en appliquant cette fonction à une chaîne particulière, str), vous n'avez pas besoin de le comparer explicitement à true: vous pouvez simplement l'utiliser. Comme vous le verrez d'après les réponses des autres, le code dans lequel les expressions de type booléen sont explicitement comparées aux littéraux booléens provoquera souvent une douleur de type code dans le lecteur :) (Mon «peeve» préféré est <boolean expression> ? true : false).

+0

Est-ce que la fonction isEquals() n'est pas une fonction? – CJ7

+0

@Craig Johnston: oui, 'est égal à' est une fonction qui consomme * deux * valeurs et renvoie un booléen. En spécifiant l'une de ces valeurs à l'avance, nous créons un prédicat, une fonction qui consomme * une * valeur et renvoie un booléen. – AakashM

+0

Pourquoi dites-vous isEquals est une fonction qui consomme deux valeurs? Il consomme une seule valeur: le paramètre de chaîne. – CJ7

0

Il n'y a rien de mal.

seulement deux façons différentes de ramasser la même cuillère pour vous nourrir;)