2010-12-15 54 views
3

L'opérateur == surchargé suivant fait partie de la classe Calender dans QL.netAi-je changé l'intention de l'opérateur `==` surchargé?

public static bool operator ==(Calendar c1, Calendar c2) 
    { 
     return (c1.empty() && c2.empty()) 
       || (!c1.empty() && !c2.empty() && c1.name() == c2.name()); 
    } 

    public bool empty() { return (object)calendar == null; }  

Lorsque je tente d'accéder à la propriété SouthAfricanCalender, je reçois un System.NullReferenceException : Object reference not set to an instance of an object. qui m'a incité à creuser dans la source.

public SouthAfrica SouthAfricanCalender 
{ 
    get 
    { 
     if (_calender == null) 
     { 
     _calender = new SouthAfrica(); 
     } 
    return _calender; 
    } 
    set 
    { 
     if (_calender == null) 
     { 
     _calender = value; 
     } 
    } 
} 

SouthAfrica _calender; 

Je la surcharge des règlements ultérieurs comme suit en fonction de la réponse here

public static bool operator ==(Calendar c1, Calendar c2) 
{ 
    if (object.ReferenceEquals(c1,c2)) return true; 
    if ((object)c1 == null || (object)c2 == null) return false; 

    return (c1.empty() && c2.empty()) 
     || (!c1.empty() && !c2.empty() && c1.name() == c2.name()); 
} 

Ma question, ai-je changé l'intention du code original avec mon amendement?

Editer: toutes les suggestions sur la façon dont cela peut être nettoyé davantage?

+0

Vous n'avez pas besoin de 'if ((object) c1 == null || (objet) c2 == null) return false;' aucune conversion en objet n'est requise. seulement 'si c1 == null || (c2 == null) return false; ' – Aliostad

+0

@aliostad - merci pour la suggestion ... – Ahmad

+4

@aliostad: Pas vrai! Sans la conversion 'object', vous obtiendrez potentiellement une boucle infinie d'appels' == 'menant à une' StackOverflowException'. – LukeH

Répondre

1

Non Vous vous assurez que les deux sont des objets, et répondez en conséquence dans les endroits qu'ils ne sont pas (en supposant que ReferenceEquals peut gérer double null). Ensuite, vous exécutez simplement le même contrôle. La chose entière .empty() est totalement inutile, d'ailleurs, vous savez déjà que ce n'est pas nul, il suffit de retourner la comparaison des noms.

1

Non, vous ne l'avez pas.

Il vérifie toujours l'égalité.