Метод расширения с нулевой проверкой - PullRequest
8 голосов
/ 08 февраля 2012

Итак, я много работаю с базой данных в приложении - и есть несколько возможных возвращаемых значений моей системы кэширования. Он может возвращать ноль, он может возвращать значение по умолчанию (тип) или может возвращать недопустимый объект (под недопустимым объектом я имею в виду объект с неправильными свойствами / значениями). Я хочу создать метод расширения, чтобы сделать все эти проверки для меня, например, так:

    public static bool Valid<T> (this T obj) where T: class
    {
        if (obj == null) 
            return false;
        else if (obj == default(T))
            return false;
        //Other class checks here
        else 
            return true;
    }

Проблема в том, что мой компилятор говорит мне, что if (obj == default(T)) всегда будет ложным.

Почему это?

Ответы [ 3 ]

21 голосов
/ 08 февраля 2012

Поскольку у вас есть ограничение "class" (where T: class), default(T) равно всегда равно нулю. У вас уже есть проверка для этого в исходном операторе if, поэтому второй случай (obj == default(T)) никогда не может быть истинным.

1 голос
/ 26 марта 2012

Я не уверен, если вы ограничиваете его в классе, потому что вы хотите или потому что вы чувствуете, что должны. Если это последнее, вот способ выполнить проверку значений по умолчанию для сложных и простых типов:

public static bool Valid<T> (this T obj)
{
    return !EqualityComparer<T>.Default.Equals(obj, default(T));
}

Если ваш выбор ограничить его только для класса был преднамеренным или для бизнес-случая, не стесняйтесь игнорировать это предложение. Еще одна вещь, которую это может не учитывать, - это упаковка простых типов (хотя в эти дни я обычно использую простые типы, допускающие значение nullable, для которых этот код работает).

0 голосов
/ 09 февраля 2012

Первое решение, которое вам нужно сделать: Может ли T быть типом значения типа int ?
Если это так, вы можете удалить

 where T: class

и

if (obj == null) return false;
else 

Если T всегда является ссылочным типом, вы можете удалить

if (obj == null) return false;
...