2014-06-27 9 views
6

Bei der Umsetzung IEqualityComparer<Product> (Product ist eine Klasse), klagt ReSharper, dass die Nullprüfung unter immer falsch ist:Bei der Implementierung von IEqualityComparer sollte GetHashCode auf Null überprüfen?

public int GetHashCode(Product product) 
{ 
    // Check whether the object is null. 
    if (Object.ReferenceEquals(product, null)) 
    return 0; 

    // ... other stuff ... 
} 

(Code-Beispiel aus MSDN VS.9 documentation of Enumerable.Except)

ReSharper falsch sein kann, aber wenn für eine Suche Antwort kam ich die official documentation for IEqualityComparer<T> über denen ein Beispiel hat, wo null für nicht aktiviert ist:

public int GetHashCode(Box bx) 
{ 
    int hCode = bx.Height^bx.Length^bx.Width; 
    return hCode.GetHashCode(); 
} 

Zusätzlich die Dokumentation GetHashCode() states dass ArgumentNullException wird geworfen, wenn "Der Typ von Obj ist ein Referenztyp und Obj ist Null."

Also, bei der Implementierung IEqualityComparer sollte GetHashCode auf Null überprüfen, und wenn ja, was sollte es mit Null tun (eine Ausnahme werfen oder einen Wert zurückgeben)?

Ich interessiere mich am meisten in .NET Framework offizielle Dokumentation, die die eine oder andere Weise angibt, wenn Null überprüft werden sollte.

Antwort

7

ReSharper ist falsch.

Offensichtlich Code, den Sie schreiben, kann diese bestimmte GetHashCode Methode anrufen und in einem null Wert übergeben. Alle bekannten Methoden können sicherstellen, dass dies nie passieren wird, aber offensichtlich kann ReSharper nur vorhandenen Code (Muster) berücksichtigen.

Also in diesem Fall, überprüfen Sie für null und tun Sie das "Richtige".


Corollary: Wenn die Methode in Frage privat war, dann könnte ReSharper analysieren (obwohl ich nicht sicher bin, es tut), um den öffentlichen Schlüssel und stellen Sie sicher, dass es tatsächlich keine Möglichkeit, dass diese besondere private Methode wird aufgerufen, mit einer null Referenz, aber da es eine öffentliche Methode ist und eine über eine Schnittstelle verfügbar ist, dann

ReSharper ist falsch.

+0

Natürlich ist das "richtige Ding" [zur Debatte] (http://stackoverflow.com/questions/10723458/should-the-hash-code-of-null-always-be-zero-in-net)? rq = 1) wenn Sie bedenken, dass in der Dokumentation angegeben wird, dass eine 'ArgumentNullExpection' ausgelöst werden soll, aber .NET integrierte Klassen nicht wirklich auf Null setzen. – FriendlyGuy

2

Die Dokumentation sagt, dass Nullwerte niemals hashable sein sollten, und dass der Versuch, dies zu tun, immer zu einer Ausnahme führen sollte.

Natürlich können Sie tun, was Sie wollen. Wenn Sie eine Hash-basierte Struktur erstellen möchten, für die Nullschlüssel gültig sind, können Sie dies tun. In diesem Fall sollten Sie diese Warnung einfach ignorieren.

+0

Korrigieren, jedenfalls frage ich mich, warum Resharper sagt, dass Null-Check immer falsch ist ... – digEmAll

+1

@digEmAll Weil es die Dokumentation glaubt. – Servy

Verwandte Themen