Типы Nullable: лучший способ проверить на пустой указатель или нуль в c#

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

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

Существует ли лучший путь?

74
задан TMT 17 October 2019 в 04:35
поделиться

0 ответов

Мне нравится if ((item.Rate ?? 0) == 0) { }

Обновление 1:

Вы могли также определить дополнительный метод как:

public static bool IsNullOrValue(this double? value, double valueToCheck)
{
    return (value??valueToCheck) == valueToCheck;
}

И использование это как это:

if(item.IsNullOrValue(0)){}//, но Вы не добираетесь очень от него

144
ответ дан Berkay Turancı 24 November 2019 в 11:47
поделиться

Используя дженерики:

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, скажем, удвойтесь, default(t) 0d, поскольку bool false, поскольку символ '\0' и так далее...

41
ответ дан CMS 24 November 2019 в 11:47
поделиться

Это - действительно просто расширение принятого ответа Freddy Rios только с помощью Дженериков.

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) на пустой указатель, так как мы имеем дело или с типами значения или со структурами! Это также означает, что мы можем безопасно предположить, что T valueToCheck не будет пустым; Помнить здесь это T? краткий Nullable< T> таким образом путем добавления расширения Nullable< T> мы получаем метод в интервале?, дважды?, bool? и т.д.

Примеры:

double? x = null;
x.IsNullOrDefault(); //true

int? y = 3;
y.IsNullOrDefault(); //false

bool? z = false;
z.IsNullOrDefault(); //true
19
ответ дан Joshua Shannon 24 November 2019 в 11:47
поделиться

Я соглашаюсь с использованием?? оператор.

, Если Вы имеете дело со строковым использованием если (Строка. IsNullOrEmpty (myStr))

2
ответ дан Nick Josevski 24 November 2019 в 11:47
поделиться

там лучший путь?

ну, при реальном поиске лучшего пути можно, вероятно, добавить другой слой абстракции сверх Уровня. Хорошо вот что-то, что я просто придумал использование Шаблона разработки Nullable.

using System;
using System.Collections.Generic;

namespace NullObjectPatternTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var items = new List
                            {
                                new Item(RateFactory.Create(20)),
                                new Item(RateFactory.Create(null))
                            };

            PrintPricesForItems(items);
        }

        private static void PrintPricesForItems(IEnumerable items)
        {
            foreach (var item in items)
                Console.WriteLine("Item Price: {0:C}", item.GetPrice());
        }
    }

    public abstract class ItemBase
    {
        public abstract Rate Rate { get; }
        public int GetPrice()
        {
            // There is NO need to check if Rate == 0 or Rate == null
            return 1 * Rate.Value;
        }
    }

    public class Item : ItemBase
    {
        private readonly Rate _Rate;
        public override Rate Rate { get { return _Rate; } }
        public Item(Rate rate) { _Rate = rate; }
    }

    public sealed class RateFactory
    {
        public static Rate Create(int? rateValue)
        {
            if (!rateValue || rateValue == 0) 
                return new NullRate();
            return new Rate(rateValue);
        }
    }

    public class Rate
    {
        public int Value { get; set; }
        public virtual bool HasValue { get { return (Value > 0); } }
        public Rate(int value) { Value = value; }
    }

    public class NullRate : Rate
    {
        public override bool HasValue { get { return false; } }
        public NullRate() : base(0) { }
    }
}
2
ответ дан dance2die 24 November 2019 в 11:47
поделиться

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

Редактирование: Помните,'?' просто сахар компилятора для типа INullable, таким образом, Вы могли, вероятно, взять INullable, поскольку parm и затем jsut сравнивают его с пустым указателем (parm == пустой указатель) и если не пустой выдерживают сравнение с нулем.

2
ответ дан Walden Leverich 24 November 2019 в 11:47
поделиться
public static bool nz(object obj)
{
    return obj == null || obj.Equals(Activator.CreateInstance(obj.GetType()));
}
0
ответ дан 24 November 2019 в 11:47
поделиться
class Item{  
 bool IsNullOrZero{ get{return ((this.Rate ?? 0) == 0);}}
}
0
ответ дан dtroy 24 November 2019 в 11:47
поделиться

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

String.IsNullOrEmpty(str)

Вместо:

str==null || str==""
0
ответ дан Termininja 24 November 2019 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: