2010-12-15 8 views
3

Die folgenden überladenen == Betreiber Teil der Calender Klasse in QL.netHabe ich die Absicht des überschriebenen `==` Operators geändert?

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; }  

ist, wenn ich versuche, die SouthAfricanCalender Eigenschaft zuzugreifen, erhalte ich ein System.NullReferenceException : Object reference not set to an instance of an object., die mich dazu veranlassten in die Quelle zu graben.

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

SouthAfrica _calender; 

Ich habe die Überlastung Fügte wie auf die Antwort 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()); 
} 

Meine Frage basiert folgt, haben sich geändert ich die Absicht der ursprünglichen Code mit meiner Änderung?

Edit: irgendwelche Vorschläge, wie dies weiter aufgeräumt werden kann?

+0

Sie brauchen nicht if ((Objekt) c1 == null || (Objekt) c2 == null) return false; 'kein Casting zum Objekt erforderlich. nur 'wenn c1 == null || (c2 == null) return false; ' – Aliostad

+0

@aliostad - danke für den Vorschlag ... – Ahmad

+4

@aliostad: Nicht wahr! Ohne die Umwandlung in "Objekt" erhalten Sie möglicherweise eine Endlosschleife von '==' Aufrufen, die zu einer 'StackOverflowException' führen. – LukeH

Antwort

1

Nein. Sie stellen sicher, dass beide Objekte sind, und reagieren entsprechend an den Stellen, an denen sie nicht vorhanden sind (vorausgesetzt, dass ReferenceEquals mit double null umgehen kann). Dann führen Sie einfach denselben Check aus. Das ganze .empty() Ding ist völlig unnötig, übrigens weißt du schon, dass es nicht null ist, gib einfach den Namensvergleich zurück.

1

Nein, haben Sie nicht.

Es prüft immer noch auf Gleichheit.

Verwandte Themen