Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Ну, они не плохая идея, я думаю. Dictionary<K, V>
имеет TryGetValue
метод, который является очень хорошим примером, почему параметры иногда являются очень хорошей вещью иметь.
Вы не должны злоупотреблять эту функцию, конечно, но это не плохая идея на определение. Особенно не в C#, где необходимо записать out
ключевое слово в вызове объявления функции и , который делает его очевидным, что продолжается.
Некоторые языки за пределами .NET использует их в качестве пустых макросов, которые просто дают информацию о программисте о том, как параметры используются в функции.
Я не думаю, что существует настоящая причина, хотя я не видел, что она часто использовала это (кроме вызовы P/Invoke).
Ключевое слово необходимо (см. SortedDictionart.TryGetValue
). Это подразумевает передачу ссылкой и также говорит компилятор что следующее:
int value;
some_function (out value);
в порядке и что some_function
не использует значение unitialised, которое обычно было бы ошибкой.
Одна точка, которую я не вижу упомянутый, - то, что ключевое слово также требует, чтобы вызывающая сторона определила. Это важно, так как это помогает удостовериться, что вызывающая сторона понимает, что вызывание этой функции изменит его переменные.
Это - одна причина, почему мне никогда не нравилось использовать ссылки как параметры в C++. Вызывающая сторона может легко назвать метод, не зная, что его параметр будет изменен.
Я думаю в некоторых сценариях, они - хорошая идея, потому что они позволяют больше чем 1 объекту быть возвращенным из функции, например:
DateTime NewDate = new DateTime();
if (DateTime.TryParse(UserInput, out NewDate) == false) {
NewDate = DateTime.Now;
}
Очень полезный:)
Я сказал бы ответ, который Вы дали, о лучшем существует. Необходимо всегда разрабатывать далеко от out
параметры, если это возможно, потому что это обычно делает код напрасно сложным.
, Но это верно для примерно любого шаблона. Если нет никакой потребности в нем, не используйте его.
' out
' является большим!
Это делает ясный оператор, что параметр содержит значение, которое будет возвращено методом.
компилятор также вызывает, Вы к инициализируете он (если мы используем в качестве возвращаемого параметра, он должен быть инициализирован).
Это похоже на парня Tanqueray, любит говорить - Все умеренно.
я определенно подчеркнул бы против злоупотребления, так как оно приведет к "записи c в c#" почти такой же способ, которым можно записать Java в Python (где Вы не охватываете шаблоны и идиомы, которые делают новый язык особенным, но вместо этого просто думающий на Вашем старом языке и преобразовывающий в новый синтаксис). Однако, как всегда, если это помогает Вашему коду быть более изящным и иметь больше смысла, скала.
Я сказал бы свою причину избежать его, будет то, потому что является самым простым иметь метод, обрабатывают данные и возвращают одну логическую часть данных. Если это должно возвратить больше данных, это может быть кандидат на дальнейшую абстракцию или формализацию возвращаемого значения.
Одно исключение - то, если возвращенные данные являются несколько третичными, как nullable bool. Это может быть истинно/ложно или не определено. Параметр может помочь решить подобную идею для других логических типов.
Другой, который я использую иногда, - когда необходимо получить информацию через интерфейс, который не допускает 'лучший' метод. Как использование.Net библиотеки доступа к данным и ORM, например. Когда необходимо возвратить обновленный граф объектов (после ОБНОВЛЕНИЯ), или новый сгенерированный RDBMS идентификатор (ВСТАВЛЯЮТ) плюс то, сколько строк было затронуто оператором. SQL возвращает все это в одном операторе, таким образом, множественные вызовы метода не будут работать Вашим слоем данных, библиотекой, или ORM только называет одну универсальную команду INSERT/UPDATE и не может сохранить значения для более позднего извлечения.
Идеальные методы как никогда использование динамических списков параметров, или параметров, не всегда практичны все время. Снова, просто думайте дважды, является ли параметр действительно правильным способом сделать это. Если так, пойдите для него. (Но удостоверьтесь, что зарегистрировали его хорошо!)
Я не думаю, что они. Неправильное использование их является плохой идеей, но это идет для любой практики/техники кодирования.
Ну, нет никакого четкого ответа для этого, но простым вариантом использования для параметра был бы "Интервал. TryParse ("1", myInt)"
задание метода XXX.TrayParse, это преобразовывает значение некоторого типа к другому типу, это возвращает Вам булев флаг для указания на успешность или неуспешность преобразования, которая является одной частью, другая часть является преобразованным значением, которое несут параметр в том методе.
Этот метод TryParse был представлен в.NET 2.0 для преобладания над тем, что XXX.Parse будет посредством исключения, если преобразование перестанет работать, и необходимо вставить попытку/выгоду вокруг оператора.
Так в основном это зависит от того, что Ваш метод делает, и что ожидают вызывающие стороны метода, если Вы сделаете метод, который возвращает некоторую форму кодов ответа, тогда параметры могли быть использованием для выполнения возвращенных результатов метода.
так или иначе Microsoft заявляет, "Избегают использования параметров", в их руководстве по проектированию, проверьте эту страницу MSDN http://msdn.microsoft.com/en-us/library/ms182131 (По сравнению с 80) .aspx
Это - не всегда плохая идея использовать параметры. Обычно для кода, который пытается создать основанное на объектах на некоторой форме входа, который это - хорошая идея обеспечить Попытка метод с параметрами и булевым возвращаемым значением, не вынудить потребителя метода обернуть блоки выгоды попытки на всем протяжении, не говоря уже о лучшей производительности. Пример:
bool TryGetSomeValue(out SomeValue value, [...]);
это - случай, где параметры являются хорошим ideea.
Другой случай - то, где Вы хотите избежать дорогостоящей большой передачи структуры между методами. Например:
void CreateNullProjectionMatrix(out Matrix matrix);
эта версия избегает дорогостоящего копирования структуры.
, Но, если не необходим по определенной причине, ее нужно избежать.
Я сказал бы, что Ваш ответ является пятном на; это обычно ненужная сложность и обычно существует более простой дизайн. Большинство методов, с которыми Вы работаете в.NET, не видоизменяет их входные параметры, также - одноразовый метод, который использует синтаксис, немного сбивает с толку. Код становится немного менее интуитивным, и в случае плохо зарегистрированного метода, у нас нет способа знать то, что метод делает к входному параметру.
Кроме того, сигнатуры методов с параметрами инициируют Код нарушение Analysis/FxCop, если это будет метрикой, Вы заботитесь о. В большинство случаи, существует лучший способ выполнить намерение метода, который использует, параметр и метод могут быть пересмотрены для возврата интересной информации.
Формулировка вопроса из , "Вы прекратили поражать свою жену?" разнообразие — это предполагает, что параметры являются обязательно плохой идеей. Существуют случаи, где параметрами можно злоупотребить, but†¦
Они на самом деле подходят очень хорошо к языку C#. Они похожи касательно параметры за исключением того, что метод, как гарантируют, присвоит значение ему, и вызывающая сторона не должна инициализировать переменную.
Нормальные возвращаемые значения для функций продвинуты на стек, где их называют и выходят. Когда Вы предоставляете параметр, Вы даете методу определенный адрес памяти для всовывания результата. Это также допускает несколько возвращаемых значений, хотя использование структуры часто имеет больше смысла.
Они замечательны для Шаблона TryParse и также обеспечивают метаданные для других вещей как в случае CLR SQL, где параметры отображаются на параметры подписи хранимой процедуры.
- Параметр плохая идея, по-моему. Они увеличивают риск побочных эффектов и тверды отладить. Единственное хорошее решение является функциональными результатами, и вот проблема: Для функциональных результатов необходимо создать для каждого сложного результата кортеж или новый тип. Теперь это должно быть довольно легко в c# с анонимными типами и дженериками.
И между прочим: Я ненавижу побочные эффекты также.
Они - хорошая идея. Поскольку иногда Вы просто хотите возвратить несколько переменных из одного метода, и Вы не хотите создавать "тяжелую" структуру класса для этого. Переносящаяся структура класса может скрыть путь информационные потоки.
я использую это для:
Я должен был бы согласиться с GateKiller. Я не могу вообразить параметры, являющиеся слишком плохим, если Microsoft использовала их в качестве части основной библиотеки. Но, как со всеми вещами, лучше всего умеренно.