Mein Ansatz ist
(object)item == null
, auf dem auf object
den eigenen Gleichheitsoperator ich verlasse mich zu tun, was nicht schief gehen kann. Oder eine benutzerdefinierte Erweiterungsmethode (und eine Überlast):
public static bool IsNull<T>(this T obj) where T : class
{
return (object)obj == null;
}
public static bool IsNull<T>(this T? obj) where T : struct
{
return !obj.HasValue;
}
oder mehr Fälle zu handhaben, können sein:
public static bool IsNull<T>(this T obj) where T : class
{
return (object)obj == null || obj == DBNull.Value;
}
Die Einschränkung verhindert IsNull
auf Werttypen. Nun ist es so süß wie
object obj = new object();
Guid? guid = null;
bool b = obj.IsNull(); // false
b = guid.IsNull(); // true
2.IsNull(); // error
Aufruf was bedeutet, ich habe eine konsistente/nicht-fehleranfällige Stil der Überprüfung auf NULL-Werte im gesamten Gebäude. Ich habe auch (object)item == null
is very very very slightly faster than Object.ReferenceEquals(item, null)
gefunden, aber nur wenn es wichtig ist (ich arbeite gerade an etwas, wo ich alles optimieren muss!).
Um eine vollständige Anleitung zur Umsetzung der Gleichstellung Kontrollen zu sehen, What is "Best Practice" For Comparing Two Instances of a Reference Type?
Genau. Sowohl '(object) foo1 == null' oder' foo1 == (object) null' gehen auf die eingebaute Überladung '== (object, object)' und nicht auf die benutzerdefinierte Überladung '== (Foo , Foo) '. Es ist wie Überladungsauflösung bei Methoden. –
Zu zukünftigen Besuchern - die akzeptierte Antwort ist eine Funktion, die das == des Objekts ausführt. Das ist im Grunde das Gleiche wie die akzeptierte Antwort, mit einem Nachteil: Es braucht eine Besetzung. Die Antwort ist also überlegen. – Mafii
@Mafii Die Besetzung ist * rein * eine Kompilierzeitoperation. Da der Compiler weiß, dass die Umwandlung nicht fehlschlagen kann, muss zur Laufzeit nichts überprüft werden. Die Unterschiede zwischen den Methoden sind völlig ästhetisch. – Servy