2012-11-21 7 views
0

je traite ce type de problème tout le temps et je me demandais si vous aviez des contournements de travail élégant Slicklogique de programmation SI Alors

if(myObject != null && myObject.myProperty != myValue){ 
//do something 
}else{ 
//do something else 
} 

Si je lance cette logique, je reçois référence null lorsque myObject est nulle donc je finis par faire:

if(myObject != null){ 
    if(myObject.myProperty != myValue){ 
     //do something 
    }else{ 
     //do something else 
    } 
}else{ 
    //do something else 
} 

Je finis par avoir le code redondant sur mon « faire quelque chose d'autre » comment les gars ne vous gérer cela?

+0

Comment exactement 'quelque chose d'autre est différent ici? – raina77ow

+0

Votre premier segment de code est valide – emartel

+2

Êtes-vous sûr d'avoir deux symboles '&' dans votre code pour le premier? Si vous n'en avez qu'un, vous vous attendez à une référence nulle. Deux devraient l'empêcher. – sybkar

Répondre

2

Le premier chèque de null signifie que la deuxième condition ne sera pas évalué si ce n'est pas rencontré - lors de l'utilisation logique AND (&&) - donc je suggère que votre exception de référence nulle vient d'ailleurs, pas cette dernière condition.

+0

Belle explication, je vais choisir ceci la réponse – box86rowh

-2

votre première déclaration est tout à fait valable.

if(myObject != null && myObject.MyProperty != myValue) 

Ce que cela va faire est-il évaluera myObject != null d'abord, et comme il y a un && à droite de celui-ci, si elle est fausse, il n'a même pas besoin d'évaluer l'autre article.

Si vous venez de copier et coller le code que vous avez collé ici, je pense que vous trouverez qu'il fonctionne avec succès

+0

Ce qui est précisément ce qu'il a commencé avec ... –

+1

Cela a des erreurs de syntaxe, aussi. Mauvais cas pour 'if', et'! -' n'a pas de sens. – vcsjones

2

Il n'y a aucun moyen « élégant » pour faire face à ce - deux façons de partager le code de « faire quelque chose d'autre » sont vraiment de faire varier le degré de non-élégance:

  • Vous pouvez mettre le « faire autre chose "code dans une fonction, ou
  • Définir un indicateur avant d'entrer le if pour dire si un traitement supplémentaire est nécessaire, et agir sur le drapeau à la sortie de l'instruction if.

La première solution est explicite; la deuxième solution ressemble à ceci:

var processed = false; 
if(myObject != null) { 
    if(myObject.myProperty != myValue){ 
     //do something 
     processed = true; 
    } 
    // do more stuff knowing that myObject is not null 
} 
if (!processed) { 
    // do something else 
} 
+0

++ J'ai déjà utilisé cette construction, et je suis heureux d'avoir la confirmation qu'il y avait peu de chemin à parcourir. – John

+0

Mais d'après ce que je peux voir le PO n'a pas réellement dit "problème". –