C#: Alternative zu GenericType == null
Brauche ich, um zu überprüfen Sie ein generisches Objekt für null oder default(T). Aber ich habe ein problem... Momentan habe ich es gemacht wie hier:
if (typeof(T).IsValueType)
{
if(default(T).Equals(thing))
//Do something
else
//Do something else
}
else
{
if(thing == null)
//Do something
else
//Do something else
}
Aber dann habe ich am Ende hin, mich zu wiederholen... was ich nicht mag. Das problem ist Folgendes:
thing == null;
Hier ReSharper warnt über Mögliche Vergleiche von Wert-Typ mit 'null'.
thing == default(T);
Hier bekomme ich compiler Fehler: Cannot apply-operator '==' auf Operanden vom Typ 'T' und 'T'.
thing.Equals(null|default(T));
thing
können offensichtlich null sein (das ist, warum ich habe zu prüfen!), so wird NullReferenceException.
null|default(T).Equals(thing);
null und default(T) ist sehr oft null...
Ist es eine saubere Art und Weise, dies zu tun??
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Boxen ist nicht ein Problem, Sie könnten einfach verwenden:
Den richtigen Weg, dies zu tun ist:
Keine Boxen. Man könnte auch definieren, eine Erweiterung Methode wie diese:
.. und rufen Sie es wie folgt:
Obwohl, ich persönlich don ' T care für die Erweiterung Methoden auf T (z.B. dieses Objekt IsNull ()), da es erschwert die Lesbarkeit manchmal.
if (value == null)
funktioniert wie erwartet für alle Fälle und ist viel besser lesbar (und daher sauber).Wenn ich brauche, um zu testen, ob der Wert NULL ist, ich benutze die unten aufgeführte Methode. Ich in der Regel verwenden Sie diese beim Aufruf von Methoden jeder Art, aber nicht null, wie der Cache.
Type.IsClass
false für Schnittstellen.!Type.IsValueType
ist wahrscheinlich das, was Sie wollen. (Ich glaube, Sie brauchen noch die nullable-check.)Etwas von Boxen wird den job zu erledigen just fine.
Beste Sache, die ich denken kann, im moment ist:
Edit:
Offenbar gibt es eine statische
object.Equals
Methode, die ich nicht bewusst war:Dies ist besser.
Können Sie vermeiden-Boxen zusammen mit der Feststellung, dass die null-Zulässigkeit einer type kann bestimmt werden, statisch.
Hier ist was Sie tun können:
isDefault
TypPredicate<T>
in die generische Klassev==null
oderdefault(T).Equals(v)
je nach ErgebnisisDefault(x)
stattx==null
im rest des CodesHier ist ein Beispiel:
Tests:
Was ist Los mit diesem?
Wenn es einen Wert geben Sie dann den JIT wird einfach entfernen Sie die Aussage insgesamt.
Cannot apply operator '==' to operands of type 'T' and 'T'