Ich arbeite an einem Projekt, bei dem ich an vielen, vielen Orten nach Folgendem suche:
if(item.Rate == 0 || item.Rate == null) { }
Was ist der beste Weg, um beide Fälle zu überprüfen?
Ich habe eine Hilfsmethode hinzugefügt, die lautet:
public static bool nz(object obj)
{
var parsedInt = 0;
var parsed = int.TryParse(obj.ToString(), out parsedInt);
return IsNull(obj) || (parsed && parsedInt == 0);
}
Gibt es einen besseren Weg?
Generika verwenden:
static bool IsNullOrDefault<T>(T value) { return object.Equals(value, default(T)); } //... double d = 0; IsNullOrDefault(d); // true MyClass c = null; IsNullOrDefault(c); // true
Wenn
T
es eine ist Referenztyp ,value
wird im Vergleich zunull
(default(T)
), andernfalls, wennT
eine istvalue type
, sagen wir mal doppelt,default(t)
ist 0T, für Bool istfalse
, für char ist'\0'
und so weiter ...quelle
public static bool IsNullOrValue<T>(this T? value, T valueToCheck) where T : struct { return (value ?? default(T)).Equals(valueToCheck); }
Obwohl mir die akzeptierte Antwort sehr gefällt, denke ich, dass der Vollständigkeit halber auch diese Option erwähnt werden sollte:
if (item.Rate.GetValueOrDefault() == 0) { }
Diese Lösung
((item.Rate ?? 0) == 0)
(dies könnte jedoch Geschmackssache sein).¹ Dies sollte jedoch keinen Einfluss auf Ihre Entscheidung haben, da diese Art der Mikrooptimierung wahrscheinlich keinen Unterschied macht.
quelle
Dies ist wirklich nur eine Erweiterung der von Freddy Rios akzeptierten Antwort, die nur Generika verwendet.
public static bool IsNullOrDefault<T>(this Nullable<T> value) where T : struct { return default(T).Equals( value.GetValueOrDefault() ); } public static bool IsValue<T>(this Nullable<T> value, T valueToCheck) where T : struct { return valueToCheck.Equals((value ?? valueToCheck)); }
HINWEIS Wir müssen Standard (T) nicht auf Null prüfen, da es sich entweder um Werttypen oder Strukturen handelt! Dies bedeutet auch, dass wir davon ausgehen können, dass T valueToCheck nicht null ist. Erinnerst du dich hier an das T? ist die Kurzform Nullable <T>. Wenn Sie also die Erweiterung zu Nullable <T> hinzufügen, erhalten Sie die Methode in int?, double?, bool? etc.
Beispiele:
double? x = null; x.IsNullOrDefault(); //true int? y = 3; y.IsNullOrDefault(); //false bool? z = false; z.IsNullOrDefault(); //true
quelle
Ich bin mit der Verwendung der ?? Operator.
Wenn Sie mit Strings arbeiten, verwenden Sie if (String.IsNullOrEmpty (myStr))
quelle
Wenn Sie wirklich nach einem besseren Weg suchen, können Sie wahrscheinlich zusätzlich zu Rate eine weitere Abstraktionsebene hinzufügen. Nun, hier ist etwas, das ich mir gerade mit Nullable Design Pattern ausgedacht habe.
quelle
Ihr Codebeispiel schlägt fehl. Wenn obj null ist, führt obj.ToString () zu einer Nullreferenzausnahme. Ich würde den Prozess abkürzen und zu Beginn Ihrer Hilfsfunktion nach einem Nullobjekt suchen. Was ist der Typ, den Sie für Ihre eigentliche Frage auf Null oder Null prüfen? Auf String gibt es eine großartige IsNullOrEmpty-Funktion. Mir scheint, dies wäre eine großartige Verwendung von Erweiterungsmethoden, um eine IsNullOrZero-Methode auf dem int zu implementieren. Art.
Edit: Erinnerst du dich an das '?' ist nur Compilerzucker für den Typ INullable, daher könnten Sie wahrscheinlich ein INullable als Parameter verwenden und es dann mit null (parm == null) vergleichen und wenn nicht null mit null vergleichen.
quelle
public static bool nz(object obj) { return obj == null || obj.Equals(Activator.CreateInstance(obj.GetType())); }
quelle
class Item{ bool IsNullOrZero{ get{return ((this.Rate ?? 0) == 0);}} }
quelle
Vergessen Sie nicht, für Zeichenfolgen können Sie immer verwenden:
Anstatt:
str==null || str==""
quelle
Einen Schritt weiter von Joshua Shannons netter Antwort . Jetzt mit Verhinderung des Boxens / Unboxing :
public static class NullableEx { public static bool IsNullOrDefault<T>(this T? value) where T : struct { return EqualityComparer<T>.Default.Equals(value.GetValueOrDefault(), default(T)); } }
quelle