Вы возвращаетесь на глубину 4400, что вызывает проблемы. Также в этом нет необходимости, поскольку вы можете реализовать тот же алгоритм с помощью цикла:
while (n >= m) n -= m ;
return n ;
Рик Брюстер (автор Paint.NET) написал в блоге об альтернативе Fluent API:
http://blog.getpaint.net/2008/12/06/a-fluent-approach-to-c-parameter- validation /
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);
}
Мне лично нравится CuttingEdge.Conditions . Он прост в использовании и делает его намного более читабельным.
Это одна из немногих областей, в которых, как мне кажется, 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
был единственным допустимым способом представления " строка, которая может быть нулевой
".