Domanda

Possibile Duplicare:
Qual è il miglior algoritmo per un override del Sistema.Oggetto.GetHashCode?

Questo ci è noto che se ridefiniamo il Equals metodo di Object nel nostro tipi personalizzati, anche noi dovremmo ignorare e di fornire un'implementazione di GetHashCode metodo per supportare la generazione di hash univoco codici per l'uso un supporto di Hashtable e Dictionary collezione di classi e possono essere altre classi.

Questa mandati nostra implementazione dell'algoritmo di hash utilizzato all'interno del nostro overriden GetHashCode il metodo è ottimale e preciso cioèesso genera un hash univoco del tipo e fa anche più rapidamente possibile per migliorare le prestazioni dell'applicazione che utilizza il nostro tipo.

La mia domanda è gli algoritmi di hashing che sono accurate e garantire prestazioni ottimali se usato in GetHashCode attuazione?O, dovremmo utilizzare solo il tipo di base del GetHashCode attuazione?Vorrei sapere questa risposta per entrambi value types e reference types..

Edit:Ecco un esempio di una classe sotto sul perché avrei bisogno di ignorare Equals:

public class Laptop : LaptopBase
{
    public readonly string Make;
    public readonly string ProcessorArch;
    public readonly int MemorySupported;
    public readonly int HardDiskGBSupported;
    public readonly Color ColorName;

    public Laptop(make, procArch, memorySupp, hdGB, color)
    {
        Make = make;
        ProcessorArch = procArch;
        MemorySupported = memorySupp;
        HardDiskGBSupported = hdGB;
        ColorName = color;
    }
}

Ora, voglio restituire true per 2 Laptop istanze che sono tutti sopra i campi definiti dall'abbinamento con ogni altro, in modo che richiede di sovrascrivere l' Equals e GetHashCode metodo e anche un altro requisito, come si può vedere è che questa è una classe derivata e può essere ri-utilizzato e il supporto di un certo numero di metodi;e, quindi, non può essere fatta di un tipo di valore (struct).Ho provato con 2 istanze di tipo di cui sopra, con tutti i corrispondenti campi di istanza e se io uso l'implementazione di base di Equals - si restituisce false dove voglio essere true.. Come faccio a sostenere un tale scenario?

È stato utile?

Soluzione

Dipende di che tipo è implementato, ma dovrebbe dare una buona dispersione di valori e NON è un must per GetHashCode() per restituire un unico valore.Si dovrebbe basare su quei campi che vengono utilizzati nell'implementazione di Equals e i campi devono essere immutabili.Quindi i requisiti per Uguale/GetHashCode sono le stesse per le strutture e le classi.

E come Henk ha detto, è meglio non eseguire l'override di Equals/GetHashCode a tutti...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top