Я работаю над проектом, в котором я проверяю следующее во многих-многих местах:
if(item.Rate == 0 || item.Rate == null) { }
больше из любопытства, чем что-либо еще, как лучше всего проверить оба случая?
Я добавил вспомогательный метод:
public static bool nz(object obj)
{
var parsedInt = 0;
var parsed = int.TryParse(obj.ToString(), out parsedInt);
return IsNull(obj) || (parsed && parsedInt == 0);
}
Есть ли способ лучше?
Использование дженериков:
static bool IsNullOrDefault<T>(T value) { return object.Equals(value, default(T)); } //... double d = 0; IsNullOrDefault(d); // true MyClass c = null; IsNullOrDefault(c); // true
Если
T
это ссылочный тип ,value
будет сравниваться сnull
(default(T)
), в противном случае, еслиT
это avalue type
, скажем, double,default(t)
это 0d, для bool естьfalse
, для char'\0'
и так далее ...источник
public static bool IsNullOrValue<T>(this T? value, T valueToCheck) where T : struct { return (value ?? default(T)).Equals(valueToCheck); }
Хотя мне очень нравится принятый ответ, я думаю, что для полноты следует упомянуть и этот вариант:
if (item.Rate.GetValueOrDefault() == 0) { }
Это решение
((item.Rate ?? 0) == 0)
(хотя это может быть дело вкуса).¹ Однако это не должно повлиять на ваше решение, поскольку такие виды микрооптимизации вряд ли что-то изменит.
источник
Это действительно просто расширение принятого ответа Фредди Риоса только с использованием 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)); }
ПРИМЕЧАНИЕ: нам не нужно проверять значение по умолчанию (T) на null, поскольку мы имеем дело либо с типами значений, либо со структурами! Это также означает, что мы можем с уверенностью предположить, что T valueToCheck не будет нулевым; Помните здесь, что T? является сокращением Nullable <T>, поэтому, добавляя расширение к Nullable <T>, мы получаем метод в int ?, double ?, bool? и т.п.
Примеры:
double? x = null; x.IsNullOrDefault(); //true int? y = 3; y.IsNullOrDefault(); //false bool? z = false; z.IsNullOrDefault(); //true
источник
Я согласен с использованием ?? оператор.
Если вы имеете дело со строками, используйте if (String.IsNullOrEmpty (myStr))
источник
Что ж, если вы действительно ищете лучший способ, вы, вероятно, можете добавить еще один уровень абстракции поверх Rate. Вот кое-что, что я только что придумал, используя Nullable Design Pattern.
источник
Образец кода не удастся. Если obj имеет значение null, obj.ToString () приведет к исключению нулевой ссылки. Я бы сократил процесс и проверил наличие нулевого объекта в начале вашей вспомогательной функции. Что касается вашего фактического вопроса, какой тип вы проверяете на ноль или ноль? В String есть отличная функция IsNullOrEmpty, мне кажется, это было бы отличным использованием методов расширения для реализации метода IsNullOrZero в int? тип.
Изменить: Помните, "?" - это просто сахар компилятора для типа INullable, поэтому вы, вероятно, можете взять INullable в качестве parm, а затем jsut сравнить его с нулем (parm == null), а если не null, сравнить с нулем.
источник
public static bool nz(object obj) { return obj == null || obj.Equals(Activator.CreateInstance(obj.GetType())); }
источник
class Item{ bool IsNullOrZero{ get{return ((this.Rate ?? 0) == 0);}} }
источник
Не забывайте, что для строк всегда можно использовать:
Вместо:
str==null || str==""
источник
На шаг дальше от красивого ответа Джошуа Шеннона . Теперь с предотвращением бокса / распаковки :
public static class NullableEx { public static bool IsNullOrDefault<T>(this T? value) where T : struct { return EqualityComparer<T>.Default.Equals(value.GetValueOrDefault(), default(T)); } }
источник