Краткий ответ: НЕТ, НЕТ
Предложение:
Без сложного кода или включения сторонних библиотек в смесь, я думаю, вы должны учитывать следующие моменты при разработке своего кода:
- Что должен делать этот код для предоставления диапазона аргументов?
- Кто бы ни вызывал этот фрагмент кода, знает о возможных результатах указанного метода?
Первое, что вы можете сделать, это задокументировать методы.
В вашем примере кажется, что getArg
может вернуть null
. Итак, хорошим подходом может быть:
/// <summary>
/// Describe your method here
/// </summary>
/// <returns>Describe what it returns</returns>
/// <remarks>May return NULL if (explain why)</remarks>
public TypeName getArg()
{
//do your code here
}
Потрясающий. Итак, теперь тот, кто намеревается использовать метод getArg()
, будет иметь хорошее описание того, что делает метод, и, эй, он может даже дать вам экземпляр null
в ответе.
Вы можете сделать то же самое с foo()
. Теперь не ясно, должен ли foo()
работать или нет, если в параметре передается null
. Но из вашего описания функциональности кажется, что это сломает приложение, если это так.
Если это так, вы, вероятно, захотите, чтобы foo()
выдавало исключение.
Итак, хорошим подходом будет:
/// <summary>
/// Describe your method here
/// </summary>
/// <param name="args">Describe the argument here</param>
/// <exception cref="System.ArgumentNullException">When args is null</exception>
public void foo(TypeName args)
{
if (args == null)
throw new ArgumentNullException(nameof(args));
//do your code here
}
Мы почти на месте.
Теперь кусок кода, который связывает все вместе...
Вы знаете из документации (вы) при условии, что:
args
может быть null
foo()
выдает исключение, если args
равно null
И из документации вы знаете, что хотите избежать try catch
, насколько это возможно, из-за производительности.
Предоставленный вами код должен быть окончательным кодом :)
var args = getArgs();
if (args != null)
foo(args);
Но опять же. Это просто использование стандартного кода .net.
В любом случае, документирование вашего кода всегда желательно, предоставляя контекст и предотвращая ошибки из-за отсутствия знаний о том, как использовать код :)
person
DesertFox
schedule
01.05.2017
null
в качестве параметра. Например, ваш методfoo
должен иметь что-то наверху по строкамif (arg == null) return;
, если он не должен работать, когда ему передается нулевое значение. - person Abion47   schedule 01.05.2017?
, если вы вызываетеfoo
onarg
. т. е. если вы сделалиarg?.foo()
, тоfoo
будет вызываться только в том случае, еслиarg
не равно нулю. - person Abion47   schedule 01.05.2017arg
равно нулю. напримерfoo(arg == null ? new ArgObject() : arg);
- person Abion47   schedule 01.05.2017null
в качестве параметра - не согласен. Передача ссылки, отличной отnull
, вполне может быть предпосылкой для того, чтобы вызов имел смысл. В качестве методаvoid
он может проверять свой аргумент и немедленно возвращать значение, если аргумент равенnull
, но методы, отличные отvoid
, не обязательно могут это делать (поскольку значение по умолчанию не обязательно имеет смысл). Вместо этого в любом случае следует выброситьArgumentNullException
, и в этот момент, очевидно, ответственность за вызов кода... - person O. R. Mapper   schedule 01.05.2017null
. - person O. R. Mapper   schedule 01.05.2017null
значений. Я знаю, что существует множество примеров методов, которые возвращаютnull
для указания некоторого состояния, но обычно это должны быть исключительные случаи, и с ними нужно обращаться, выбрасывая исключение. Вот почему я считаю, что этот тип сценария действительно не должен появляться в первую очередь. Да, Ганс предполагает; но мы все должны, учитывая отсутствие контекста, и его заметка разумна. - person Peter Duniho   schedule 01.05.2017null
как часть их обычной работы, вам не нужно проверять результат дляnull
прежде чем передать его чему-то другому, таким образом, удаляя необходимость в нулевых проверках. Например, мне очень нравится в C# и C++ то, чтоnew
всегда возвращает значения, отличные отnull
; единственный способ, которым это невозможно, - это исключение. - person Peter Duniho   schedule 01.05.2017getArgs
илиfoo
, использование троичного кода в поле параметра является самым близким к удалению нулевой проверки полностью. - person Abion47   schedule 01.05.2017null
, разумна предварительная проверка, выполненная вызывающим кодом . Тот факт, что возникает исключение, означает, что не следует вызывать этот метод, если вам не нужно передать что-то не-null
. А проверка по вызывающему коду означает Если у меня естьarg
, то мне нужно вызвать на нем метод, а если у меня нетarg
, то ничего не должно происходить. - person O. R. Mapper   schedule 01.05.2017