Существует ли способ потребовать, чтобы аргумент, предоставленный методу, не был нулевым?

Вы возвращаетесь на глубину 4400, что вызывает проблемы. Также в этом нет необходимости, поскольку вы можете реализовать тот же алгоритм с помощью цикла:

while (n >= m) n -= m ;
return n ;
5
задан Eric Anastas 16 April 2009 в 00:31
поделиться

4 ответа

Рик Брюстер (автор Paint.NET) написал в блоге об альтернативе Fluent API:

http://blog.getpaint.net/2008/12/06/a-fluent-approach-to-c-parameter- validation /

0
ответ дан 15 December 2019 в 01:10
поделиться

There is no other better way. This is the way a ton of Microsoft libraries handle the situation.

You can always use an extension method to make it a little clearer.

static IsNullArgument(this Object o, string arg)
{
    if (o == null)
        throw ArgumentNullException(arg);
}
1
ответ дан 15 December 2019 в 01:10
поделиться

Мне лично нравится CuttingEdge.Conditions . Он прост в использовании и делает его намного более читабельным.

1
ответ дан 15 December 2019 в 01:10
поделиться

Это одна из немногих областей, в которых, как мне кажется, C # вышел из C ++.

В C ++ вы могли бы написать

void foo(Bar& bar) { /*...*/ }

, чтобы довольно четко указать и компилятору, и другим людям, что foo взял фактический экземпляр Bar . Да, можно - с усилием - передать foo нулевую ссылку, но это не совсем допустимо в C ++.

Ваше единственное «решение» (своего рода) в C # - сделать ваше ] class es вместо struct s, поскольку типы значений в .NET не могут быть null (в вашем примере b никогда не может быть null , потому что это System.Int32 ). Вызов bar () не скомпилируется:

    class A { }
    struct B { }

    static void foo(A a) { }
    static void bar(B b) { }

    static void Main(string[] args)
    {
        foo(null);
        bar(null);
    }

Безусловно, было бы неплохо, чтобы C # сделал (намного) более трудным иметь нулевые ссылки; F #, например, не имеет обнуляемых типов.

Для некоторых интересных комментариев, связанных с этим вопросом, прочитайте Нулевые ссылки: Ошибка в миллиард долларов (и комментарии).


Редактировать: В сноске за февраль 2013 года от Эрика Липперта говорится: «... так сложилось, что когда C # был впервые реализован, у него всегда были обнуляемые ссылочные типы, ... кажется вероятным, что Nullable можно было бы реализовать для работы с любым типом, и тогда ссылочные типы по умолчанию не могли бы обнуляться. У нас могла бы быть система типов, где Nullable был единственным допустимым способом представления " строка, которая может быть нулевой ".

1
ответ дан 15 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

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