Pracuję nad projektem, w którym w wielu, wielu miejscach sprawdzam następujące kwestie:
if(item.Rate == 0 || item.Rate == null) { }
bardziej jako ciekawostka niż cokolwiek innego, jak najlepiej sprawdzić oba przypadki?
Dodałem metodę pomocniczą, która jest:
public static bool nz(object obj)
{
var parsedInt = 0;
var parsed = int.TryParse(obj.ToString(), out parsedInt);
return IsNull(obj) || (parsed && parsedInt == 0);
}
Czy jest lepszy sposób?
Korzystanie z typów ogólnych:
static bool IsNullOrDefault<T>(T value) { return object.Equals(value, default(T)); } //... double d = 0; IsNullOrDefault(d); // true MyClass c = null; IsNullOrDefault(c); // true
Jeśli
T
jest to typ referencyjny ,value
zostanie porównany znull
(default(T)
), w przeciwnym razie, jeśliT
tovalue type
, powiedzmy double,default(t)
to 0d, dla bool isfalse
, for char is'\0'
i tak dalej ...źródło
public static bool IsNullOrValue<T>(this T? value, T valueToCheck) where T : struct { return (value ?? default(T)).Equals(valueToCheck); }
Chociaż podoba mi się przyjęta odpowiedź, myślę, że dla kompletności tę opcję należy również wspomnieć:
if (item.Rate.GetValueOrDefault() == 0) { }
To rozwiązanie
((item.Rate ?? 0) == 0)
(choć może to być kwestia gustu).¹ Nie powinno to jednak wpłynąć na Twoją decyzję, ponieważ jest mało prawdopodobne, aby tego rodzaju mikro-optymalizacja miała jakiekolwiek znaczenie.
źródło
To naprawdę tylko rozwinięcie zaakceptowanej odpowiedzi Freddy'ego Riosa tylko przy użyciu Generics.
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)); }
UWAGA nie musimy sprawdzać wartości default (T) dla null, ponieważ mamy do czynienia z typami wartości lub strukturami! Oznacza to również, że możemy bezpiecznie założyć, że wartość T valueToCheck nie będzie zerowa; Pamiętasz tutaj, że T? jest skrótem Nullable <T>, więc dodając rozszerzenie do Nullable <T> otrzymujemy metodę w int ?, double ?, bool? itp.
Przykłady:
double? x = null; x.IsNullOrDefault(); //true int? y = 3; y.IsNullOrDefault(); //false bool? z = false; z.IsNullOrDefault(); //true
źródło
Zgadzam się z użyciem ?? operator.
Jeśli masz do czynienia z ciągami znaków, użyj if (String.IsNullOrEmpty (myStr))
źródło
Cóż, jeśli naprawdę szukasz lepszego sposobu, prawdopodobnie możesz dodać kolejną warstwę abstrakcji do Rate. Oto coś, co właśnie wymyśliłem, używając wzorca projektowego Nullable.
źródło
Twój przykładowy kod nie powiedzie się. Jeśli obj ma wartość null, wówczas obj.ToString () spowoduje wyjątek odwołania o wartości null. Skróciłbym proces i sprawdziłbym, czy na początku twojej funkcji pomocniczej nie ma null obj. A jeśli chodzi o twoje aktualne pytanie, jakiego typu sprawdzasz pod kątem wartości null lub zero? W String jest świetna funkcja IsNullOrEmpty, wydaje mi się, że byłoby to świetne użycie metod rozszerzających do zaimplementowania metody IsNullOrZero w int? rodzaj.
Edycja: pamiętaj, „?” jest tylko cukrem kompilatora dla typu INullable, więc prawdopodobnie możesz wziąć INullable jako parametr, a następnie porównać go z wartością null (parm == null), a jeśli nie, to porównać do zera.
źródło
public static bool nz(object obj) { return obj == null || obj.Equals(Activator.CreateInstance(obj.GetType())); }
źródło
class Item{ bool IsNullOrZero{ get{return ((this.Rate ?? 0) == 0);}} }
źródło
Nie zapominaj, że w przypadku stringów zawsze możesz użyć:
Zamiast:
str==null || str==""
źródło
O krok dalej od miłej odpowiedzi Joshuy Shannona . Teraz z zapobieganiem boksowaniu / rozpakowywaniu :
public static class NullableEx { public static bool IsNullOrDefault<T>(this T? value) where T : struct { return EqualityComparer<T>.Default.Equals(value.GetValueOrDefault(), default(T)); } }
źródło