Подтвердить что ты не робот

Зачем бросать нуль, прежде чем проверять, равен ли объект нулю?

Я просматривал проект Проект, ориентированный на домен N-Layered.NET 4.0 Пример приложения, и просматривал какой-то код, который я не понимаю, В этом проекте они часто используют синтаксис, как показано ниже, для проверки аргументов для null:

public GenericRepository(IQueryableContext context,ITraceManager traceManager)
{
    if (context == (IQueryableContext)null)
            throw new ArgumentNullException("context", Resources.Messages.exception_ContainerCannotBeNull);

Зачем вам вводить null в тип объекта, который вы проверяете на null?

4b9b3361

Ответ 1

В данном примере это бессмысленно.

Хотя в этом случае это неприменимо, иногда возникает необходимость выбросить нуль (или, по крайней мере, до добавления значения по умолчанию (T). Рассмотрим следующее:

void DoSomething(string x) {
    ...
}

void DoSomething(object x) {
    ...
}

DoSomething(null);            // compiler can't infer the type
DoSomething((string)null);    // string type is now explicit
DoSomething(default(string)); // same as previous

ИЗМЕНИТЬ

Просто подумал о другом случае, когда вам нужно было сделать актерский состав при тестировании равенства. Если у вас был объект с перегруженным оператором ==, который допускал сравнение с двумя ссылочными типами, сравнение с нулем было бы неоднозначным. Однако, поскольку IQueryableContext, скорее всего, интерфейс и интерфейсы не могут перегружать оператор ==, я до сих пор не вижу никакой веской причины сделать это в примере, который вы дали.

class CustomObject {

    private string _id;

    public CustomObject(string id) {
        _id=id;
    }

    public static bool operator ==(CustomObject lhs, CustomObject rhs) {
        if (ReferenceEquals(lhs, rhs)) { return true; }
        if (ReferenceEquals(lhs, null)) { return false; }
        if (ReferenceEquals(rhs, null)) { return false; }
        return lhs._id == rhs._id;
    }

    public static bool operator !=(CustomObject lhs, CustomObject rhs) {
        return !(lhs == rhs);
    }

    public static bool operator ==(CustomObject lhs, string rhs) {
        if (ReferenceEquals(lhs, rhs)) { return true; }
        if (ReferenceEquals(lhs, null)) { return false; }
        if (ReferenceEquals(rhs, null)) { return false; }
        return lhs._id == rhs;
    }

    public static bool operator !=(CustomObject lhs, string rhs) {
        return !(lhs==rhs);
    }

}

CustomObject o = null;
if (o == null) {
    Console.WriteLine("I don't compile.");
}

Ответ 2

Я бы не сделал актерский состав. В этом случае нет причин для этого.

Ответ 3

В данном примере нет причин бросать нуль. Это может быть для удобочитаемости... Я не знаю, я бы этого не сделал = P

В некоторых случаях [, которые не включают в себя случай, описанный в этом разделе], вы должны указать значение INullable, прежде чем вы сможете проверить, является ли переменная нулевой. В противном случае вы должны использовать object == default (TypeOfObject)...