2010-08-05 10 views
3

Je viens de lancer un débat avec un de mes collègues sur la vérification des valeurs nulles.Question sur la vérification des valeurs nulles

Il JURE que « dans certaines situations » le code ci-dessous lui donnerait une exception valeur nulle:

string test = null; 
if(test == null) //error here 
{ 

} 

mais que si changé le code à ce qu'il n'y aurait pas d'erreur:

string test = null; 
if(null == test) //NO error here 
{ 

} 

Je lui ai dit qu'il n'y avait aucun moyen que cela puisse arriver mais il jure qu'il a corrigé son code. Y at-il une situation possible où la modification ci-dessus pourrait corriger une erreur?

+0

Pagination Eric Lippert ... –

+0

En relation http://stackoverflow.com/questions/1264781/ –

+0

L'égalité n'est pas commutative? Effrayant. – Marc

Répondre

12

Pas avec chaîne, non. Vous pouvez le faire avec une surcharge == mal écrit cependant:

using System; 

public class NaughtyType 
{ 
    public override int GetHashCode() 
    { 
     return 0; 
    } 

    public override bool Equals(object other) 
    { 
     return true; 
    } 

    public static bool operator ==(NaughtyType first, NaughtyType second) 
    { 
     return first.Equals(second); 
    } 

    public static bool operator !=(NaughtyType first, NaughtyType second) 
    { 
     return !first.Equals(second); 
    } 
} 

public class Test 
{  
    static void Main() 
    { 
     NaughtyType nt = null; 
     if (nt == null) 
     { 
      Console.WriteLine("Hmm..."); 
     } 
    } 
} 

Bien sûr, si vous avez modifié l'opérateur d'égalité à ceci:

public static bool operator ==(NaughtyType first, NaughtyType second) 
{ 
    return second.Equals(first); 
} 

alors votre code collègues échouerait, mais le vôtre wouldn t! Fondamentalement, si vous surchargez correctement les opérateurs - ou utilisez des types qui ne surchargent pas les opérateurs - ce n'est pas un problème. Si votre collègue continue de prétendre qu'il y a été confronté, demandez-lui de le reproduire. Il ne devrait certainement pas vous demander de réduire la lisibilité (je crois que la plupart des gens trouvent la première forme plus lisible) sur la base de quelque chose qu'il ne peut pas démontrer.

+0

"NaughtyType", papa aime .... –

1

Le test de if (test == null) si le test est une chaîne est valide et ne donnera jamais d'exception. Les deux tests sont également essentiellement identiques.

+0

En effet, sinon string.IsNullOrEmpty() serait également exploser, ce qui ne va pas arriver. –

+0

@Michael: Eh bien 'string.IsNullOrEmpty' * pourrait * être implémenté en utilisant' object.ReferenceEquals' ... –

2

Vous avez raison. S'il peut reproduire ceci sans un opérateur == surchargé, invitez-le à le poster ici.

+0

Ouais, c'est comme ça que les gens apprennent à programmer en C++ (et probablement d'autres langages) parce que vous pouvez assigner des choses dans le si l'expression de test. Vous ne pouvez pas assigner facilement dans une expression de test if dans C#, donc le style n'est pas nécessaire. –

6

Je pense que c'est une gauche plus d'une « meilleures pratiques » en C/C++, parce que l'utilisation « = » au lieu de « == » est facile à faire erreur:

if(test = null) // C compiler Warns, but evaluates always to false 

if(null = test) // C compiler error, null cannot be assigned to 

En C# , ils produisent tous deux une erreur.

+1

D'accord, même après de nombreuses années de programmation, ce bug stupide m'attrapait toujours en code C/C++. C# ne laissera pas cela se produire: =) – Justin

+2

Oui, je soupçonne que quelqu'un prétend "erreur de codage" pour essayer de promouvoir sa préférence de codage. –