gewusst wie: implementieren, überschreiben von GetHashCode() mit der Logik der überschriebenen Equals () -

Ich habe einige Klassen, wie unten, habe ich umgesetzt Equals(Object) Methode für fast alle von Ihnen. Aber ich weiß nicht, wie zu schreiben GetHashCode() . So weit ich diese Datentypen als Wert geben Sie eine Dictionary Sammlung, ich denke, ich sollte überschrieben GetHashCode().

1.Ich weiß nicht, wie zu implementieren GetHashCode() mit Logik Equals(Object).

2.Es gibt einige abgeleitete Klassen, wenn ich override GetHashCode() und Equals(Object) für die base-Klasse ( Param ), ist es immer noch notwendig, um es zu überschreiben für Kinder?

class Param
{
    ...
    public Int16 id { get; set; }
    public String name { get; set; }
    ...
    public override bool  Equals(object obj)
    {
        if ( obj is Param){
            Param p = (Param)(obj);
            if (id > 0 && p.id > 0)
                return (id == p.id);
            else if (name != String.Empty && p.name != String.Empty)
                return (name.equals(p.name));
            else
                return object.ReferenceEquals(this, obj);
        }
        return false;
    }
}  
class Item
{
    public int it_code { get; set; }
    public Dictionary<String, Param> paramAr { get; set; }
    ...
    public override bool Equals(Object obj)
    {
        Item im = new Item();
        if (obj is Item)
            im = (Item)obj;
        else 
            return false;

        if (this.it_code != String.Empty && im.it_code != String.Empty)
            if (this.it_code.Equals(im.it_code)) 
                return true;

        bool reParams = true;
        foreach ( KeyValuePair<String,Param> kvp in paramAr ){
            if (kvp.Value != im.paramAr[kvp.Key]) {
                reParams = false;
                break;
            }
        }
        return reParams;
    }
}
class Order
{

    public String or_code { get; set; }
    public List <Item> items { get; set; }
    ...
    public override bool Equals( Object obj ){
        Order o = new Order();
        if (obj is Order)
            o = (Order)obj;
        else
            return false;

        if (this.or_code != String.Empty && o.or_code != String.Empty)
            if (this.or_code.Equals(o.or_code))
                return true;
        bool flag = true;
        foreach( Item i in  items){
            if (!o.items.Contains(i)) { 
                flag = false;
                break;
            }
        }
        return flag;
    }
}

EDIT:
ich bekomme diese Warnung:

Warnung : 'Item' - Objekt überschreibt.Equals(object o) aber nicht
Objekt überschreiben.GetHashCode()

Ich glaube, die einzige überlegung, die Sie haben, um sich selbst beim schreiben GetHashCode, ist, dass wenn zwei Objekte gleich sind (durch Aufruf Equals) , deren hash-code muss auch gleich sein. Umgekehrt, wenn beide hash-codes gleich sind, das bedeutet nicht, dass die Objekte selbst sind gleich (obwohl Sie könnte). Wenn Sie schreiben eine benutzerdefinierte Implementierung entweder Equals oder GetHashCode haben Sie etwas zu schreiben für die andere Methode, um sicherzustellen, die Logik, die ich oben erklärt, bleibt sich treu.
Visual Studio hilft dabei jetzt docs.microsoft.com/en-us/visualstudio/ide/reference/...

InformationsquelleAutor rene | 2012-03-22

Schreibe einen Kommentar