Почему отсутствуют параметры в.NET плохая идея?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

34
задан Peter Mortensen 22 May 2013 в 13:37
поделиться

18 ответов

Ну, они не плохая идея, я думаю. Dictionary<K, V> имеет TryGetValue метод, который является очень хорошим примером, почему параметры иногда являются очень хорошей вещью иметь.

Вы не должны злоупотреблять эту функцию, конечно, но это не плохая идея на определение. Особенно не в C#, где необходимо записать out ключевое слово в вызове объявления функции и , который делает его очевидным, что продолжается.

63
ответ дан Armin Ronacher 27 November 2019 в 15:58
поделиться

Некоторые языки за пределами .NET использует их в качестве пустых макросов, которые просто дают информацию о программисте о том, как параметры используются в функции.

0
ответ дан Peter Mortensen 27 November 2019 в 15:58
поделиться

Я не думаю, что существует настоящая причина, хотя я не видел, что она часто использовала это (кроме вызовы P/Invoke).

0
ответ дан Peter Mortensen 27 November 2019 в 15:58
поделиться

Ключевое слово необходимо (см. SortedDictionart.TryGetValue). Это подразумевает передачу ссылкой и также говорит компилятор что следующее:

int value;
some_function (out value);

в порядке и что some_function не использует значение unitialised, которое обычно было бы ошибкой.

0
ответ дан Tim Cooper 27 November 2019 в 15:58
поделиться

Одна точка, которую я не вижу упомянутый, - то, что ключевое слово также требует, чтобы вызывающая сторона определила. Это важно, так как это помогает удостовериться, что вызывающая сторона понимает, что вызывание этой функции изменит его переменные.

Это - одна причина, почему мне никогда не нравилось использовать ссылки как параметры в C++. Вызывающая сторона может легко назвать метод, не зная, что его параметр будет изменен.

0
ответ дан Torlack 27 November 2019 в 15:58
поделиться

Я думаю в некоторых сценариях, они - хорошая идея, потому что они позволяют больше чем 1 объекту быть возвращенным из функции, например:

DateTime NewDate = new DateTime();
if (DateTime.TryParse(UserInput, out NewDate) == false) {
    NewDate = DateTime.Now;
}

Очень полезный:)

0
ответ дан GateKiller 27 November 2019 в 15:58
поделиться

Я сказал бы ответ, который Вы дали, о лучшем существует. Необходимо всегда разрабатывать далеко от out параметры, если это возможно, потому что это обычно делает код напрасно сложным.

, Но это верно для примерно любого шаблона. Если нет никакой потребности в нем, не используйте его.

0
ответ дан GEOCHET 27 November 2019 в 15:58
поделиться

' out' является большим!

Это делает ясный оператор, что параметр содержит значение, которое будет возвращено методом.

компилятор также вызывает, Вы к инициализируете он (если мы используем в качестве возвращаемого параметра, он должен быть инициализирован).

1
ответ дан Jonas 27 November 2019 в 15:58
поделиться

Это похоже на парня Tanqueray, любит говорить - Все умеренно.

я определенно подчеркнул бы против злоупотребления, так как оно приведет к "записи c в c#" почти такой же способ, которым можно записать Java в Python (где Вы не охватываете шаблоны и идиомы, которые делают новый язык особенным, но вместо этого просто думающий на Вашем старом языке и преобразовывающий в новый синтаксис). Однако, как всегда, если это помогает Вашему коду быть более изящным и иметь больше смысла, скала.

1
ответ дан callingshotgun 27 November 2019 в 15:58
поделиться

Я сказал бы свою причину избежать его, будет то, потому что является самым простым иметь метод, обрабатывают данные и возвращают одну логическую часть данных. Если это должно возвратить больше данных, это может быть кандидат на дальнейшую абстракцию или формализацию возвращаемого значения.

Одно исключение - то, если возвращенные данные являются несколько третичными, как nullable bool. Это может быть истинно/ложно или не определено. Параметр может помочь решить подобную идею для других логических типов.

Другой, который я использую иногда, - когда необходимо получить информацию через интерфейс, который не допускает 'лучший' метод. Как использование.Net библиотеки доступа к данным и ORM, например. Когда необходимо возвратить обновленный граф объектов (после ОБНОВЛЕНИЯ), или новый сгенерированный RDBMS идентификатор (ВСТАВЛЯЮТ) плюс то, сколько строк было затронуто оператором. SQL возвращает все это в одном операторе, таким образом, множественные вызовы метода не будут работать Вашим слоем данных, библиотекой, или ORM только называет одну универсальную команду INSERT/UPDATE и не может сохранить значения для более позднего извлечения.

Идеальные методы как никогда использование динамических списков параметров, или параметров, не всегда практичны все время. Снова, просто думайте дважды, является ли параметр действительно правильным способом сделать это. Если так, пойдите для него. (Но удостоверьтесь, что зарегистрировали его хорошо!)

2
ответ дан Jon Adams 27 November 2019 в 15:58
поделиться

Я не думаю, что они. Неправильное использование их является плохой идеей, но это идет для любой практики/техники кодирования.

2
ответ дан Kevin 27 November 2019 в 15:58
поделиться

Ну, нет никакого четкого ответа для этого, но простым вариантом использования для параметра был бы "Интервал. TryParse ("1", myInt)"

задание метода XXX.TrayParse, это преобразовывает значение некоторого типа к другому типу, это возвращает Вам булев флаг для указания на успешность или неуспешность преобразования, которая является одной частью, другая часть является преобразованным значением, которое несут параметр в том методе.

Этот метод TryParse был представлен в.NET 2.0 для преобладания над тем, что XXX.Parse будет посредством исключения, если преобразование перестанет работать, и необходимо вставить попытку/выгоду вокруг оператора.

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

так или иначе Microsoft заявляет, "Избегают использования параметров", в их руководстве по проектированию, проверьте эту страницу MSDN http://msdn.microsoft.com/en-us/library/ms182131 (По сравнению с 80) .aspx

3
ответ дан Mohamed Faramawi 27 November 2019 в 15:58
поделиться

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

bool TryGetSomeValue(out SomeValue value, [...]);

это - случай, где параметры являются хорошим ideea.

Другой случай - то, где Вы хотите избежать дорогостоящей большой передачи структуры между методами. Например:

void CreateNullProjectionMatrix(out Matrix matrix);

эта версия избегает дорогостоящего копирования структуры.

, Но, если не необходим по определенной причине, ее нужно избежать.

4
ответ дан Rashmi Pandit 27 November 2019 в 15:58
поделиться

Я сказал бы, что Ваш ответ является пятном на; это обычно ненужная сложность и обычно существует более простой дизайн. Большинство методов, с которыми Вы работаете в.NET, не видоизменяет их входные параметры, также - одноразовый метод, который использует синтаксис, немного сбивает с толку. Код становится немного менее интуитивным, и в случае плохо зарегистрированного метода, у нас нет способа знать то, что метод делает к входному параметру.

Кроме того, сигнатуры методов с параметрами инициируют Код нарушение Analysis/FxCop, если это будет метрикой, Вы заботитесь о. В большинство случаи, существует лучший способ выполнить намерение метода, который использует, параметр и метод могут быть пересмотрены для возврата интересной информации.

4
ответ дан Gabriel Isenberg 27 November 2019 в 15:58
поделиться

Формулировка вопроса из , "Вы прекратили поражать свою жену?" разнообразие — это предполагает, что параметры являются обязательно плохой идеей. Существуют случаи, где параметрами можно злоупотребить, but†¦

  • Они на самом деле подходят очень хорошо к языку C#. Они похожи касательно параметры за исключением того, что метод, как гарантируют, присвоит значение ему, и вызывающая сторона не должна инициализировать переменную.

  • Нормальные возвращаемые значения для функций продвинуты на стек, где их называют и выходят. Когда Вы предоставляете параметр, Вы даете методу определенный адрес памяти для всовывания результата. Это также допускает несколько возвращаемых значений, хотя использование структуры часто имеет больше смысла.

  • Они замечательны для Шаблона TryParse и также обеспечивают метаданные для других вещей как в случае CLR SQL, где параметры отображаются на параметры подписи хранимой процедуры.

6
ответ дан stakx supports GoFundMonica 27 November 2019 в 15:58
поделиться

- Параметр плохая идея, по-моему. Они увеличивают риск побочных эффектов и тверды отладить. Единственное хорошее решение является функциональными результатами, и вот проблема: Для функциональных результатов необходимо создать для каждого сложного результата кортеж или новый тип. Теперь это должно быть довольно легко в c# с анонимными типами и дженериками.

И между прочим: Я ненавижу побочные эффекты также.

6
ответ дан ChaosSpeeder 27 November 2019 в 15:58
поделиться

Они - хорошая идея. Поскольку иногда Вы просто хотите возвратить несколько переменных из одного метода, и Вы не хотите создавать "тяжелую" структуру класса для этого. Переносящаяся структура класса может скрыть путь информационные потоки.

я использую это для:

  • клавиша Return и данные IV в одном вызове
  • Разделение имя человека, в различные объекты (сначала - середина - lastname)
  • Разделение адрес
18
ответ дан GvS 27 November 2019 в 15:58
поделиться

Я должен был бы согласиться с GateKiller. Я не могу вообразить параметры, являющиеся слишком плохим, если Microsoft использовала их в качестве части основной библиотеки. Но, как со всеми вещами, лучше всего умеренно.

1
ответ дан Jason Z 27 November 2019 в 15:58
поделиться
Другие вопросы по тегам:

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