2010-11-29 19 views
-3

J'ai codé en Java (principalement) et .Net pendant un certain temps.|| (Ou) Opérateur logique en Java vs .Net

Ce que j'ai trouvé est que l'opérateur logique || dans .Net est différent dans le résultat à l'opérateur || dans Java.

permet de regarder le code Java suivant:

Object obj = null; 

if(obj == null || obj.toString().isEmpty()){ 
    System.out.println("Object is null"); 
} 

Le résultat du code ci-dessus sera:

objet est nul

La raison en est que obj == null est true et la seconde expression n'a pas été évaluée. Si c'était le cas, j'aurais reçu un java.lang.NullPointerException.

Et si j'utilisais le single ou (|) je recevrais aussi un NullPointerException (les deux sont évalués).

Ma question est la suivante:

Si le code était C#, je reçois toujours un ObjectReferenceNotSet etc. exception parce que la valeur de obj est nulle et la deuxième expression est toujours évaluée (quelle que soit l'opérateur) , ce qui signifie que le résultat est différent en C# qu'en Java. Si je veux changer le code C# pour fonctionner correctement, je dois créer deux instructions if.

est-il pas un moyen plus facile de le faire en C# pour être similaire à Java? (Conservez-le en 1 si avec 2 expressions)

Merci.

+1

je devais vous downvote, désolé :(mais votre question est tout à fait faux et je ne comprends pas pourquoi il est reçu plusieurs des votes! – fearofawhackplanet

+1

Je suis d'accord. Je fait une erreur sur un autre endroit. J'ai voté fermez la question.Comme je suis incapable de le supprimer. – Koekiebox

+0

Avez-vous déjà testé ce produit? – Pedro

Répondre

15

L'opérateur || en C# est en court-circuit, exactement comme en Java. Comme c'est &&. Les opérateurs | et & sont et non en court-circuit, comme en Java.

Si vos résultats sont différents, il y a un bug dans le code. Pouvez-vous nous montrer le C# offensant s'il vous plait?

Cela fonctionne très bien:

object obj = null; 

    if(obj == null || string.IsNullOrEmpty(obj.ToString())) { 
     Console.WriteLine("Object is null"); 
    } 
+0

Serait-ce également le cas pour VB.Net lors de l'utilisation d'Or? – Koekiebox

+1

@Koekiebox - non; en VB 'OrElse' court-circuite; 'Or' est ** pas ** en court-circuit. Idem 'AndAlso' vs' And' –

0

Il est appelé "évaluation de court-circuit". Il n'est pas nécessaire d'évaluer la déclaration suivante. C'est une fonctionnalité intéressante en Java.

+5

Mais c'est pareil en C#. –

1

Ce comportement est une java language feature stricte:

Au moment de l'exécution, la gauche l'opérande est évalué d'abord, [...] si la valeur résultante est true, la valeur de l'expression conditionnelle -ou est vraie et l'expression de l'opérande de droite n'est pas évaluée. Si la valeur de l'opérande de gauche est false, l'expression de droite est évaluée; [...] la valeur résultante devient la valeur de l'expression conditionnelle ou.

Ainsi, || calcule le même résultat que | sur les opérandes booléens ou booléens. Il ne diffère en ce que la droite expression d'opérande est évaluée conditionnelle plutôt que de toujours

Des règles similaires sont définies pour le java conditional-and operator.

Comparer (identique) à C#:

Les opérateurs && et || sont appelés les opérateurs logiques conditionnelles. Ils sont également appelés "logique de court-circuit".

conditionnelle et expression:

  • inclus ou l'expression
  • conditionnelle et l'expression & & inclusive ou expression

conditionnelle -ou-expression:

  • conditionnelle et l'expression
  • conditionnelle ou expression || conditionnel et l'expression

Les && et || opérateurs sont des versions conditionnelles des opérateurs & et |:

  • L'opération x && y correspond à la opération x & y, sauf que y est évalués seulement si x n'est pas false.
  • L'opération x || y correspond à l'opération x | y, sauf que y est évalué que si x n'est pas vrai.
+0

(ajouté dans la version C#, pour montrer la similarité) –

+0

@Marc - Great! Merci! –