[c#] Nullable types: лучший способ проверить нуль или ноль в c #



Answers

Использование дженериков:

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 - value type , допустим, double, default(t) равен 0d, поскольку bool - false , для char - '\0' и так далее ...

Question

Я работаю над проектом, где я нахожу, что проверяю во многих и многих местах следующее:

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);
}

Есть ли способ лучше?




Ошибка кода образца не будет выполнена. Если obj равно null, то obj.ToString () приведет к исключению нулевой ссылки. Я бы сократил процесс и проверил нулевой объект в начале вашей вспомогательной функции. Что касается вашего фактического вопроса, какой тип вы проверяете на нуль или ноль? В String есть отличная функция IsNullOrEmpty, мне кажется, что это было бы большим использованием методов расширения для реализации метода IsNullOrZero для int? тип.

Изменить: Помните, что? это просто сахара-компилятор для типа INullable, поэтому вы, вероятно, можете взять INullable как parm, а затем сравнить его с null (parm == null), а если не null, сравните с нолем.




Не забывайте, что для строк вы всегда можете использовать:

String.IsNullOrEmpty(str)

Вместо:

str==null || str==""



Это действительно просто расширение принятого ответа Фредди Риоса только с использованием 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, поскольку мы имеем дело с типами значений или структурами! Это также означает, что мы можем с уверенностью предположить, что значение TToCheck не будет равно нулю; Помните, что 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



public static bool nz(object obj)
{
    return obj == null || obj.Equals(Activator.CreateInstance(obj.GetType()));
}





Related