Почему методы TryParse используют параметр out, а не ref? - PullRequest
13 голосов
/ 29 февраля 2012

Отчасти в ответ на этот вопрос , который спрашивает о поведении параметра out, но более сфокусирован на том, почему эти TryParse методы используют out, а не ref.

Были некоторые сценарии, в которых вы хотите инициализировать значение аргумента перед синтаксическим анализом и сохранять его при сбое синтаксического анализа, но на самом деле не волнует, если он потерпит неудачу.Однако из-за параметра out значение сбрасывается.

Этот сценарий может выглядеть следующим образом ...

int arg = 123;
Int32.TryParse(someString, ref arg);

Однако из-за параметра out мы должны записать егокак это, что более многословно ...

int arg;
if(!Int32.TryParse(someString, out arg)
{
    arg = 123;
}

Я понимаю, что знание того, что анализ не удался, может быть очень полезным, однако использование ref не исключает этого.

Такпочему эти методы TryParse используют out, а не ref?

Ответы [ 4 ]

13 голосов
/ 29 февраля 2012

Потому что шаблон обычного использования в точности противоположен тому, что вы описываете.

Люди должны уметь писать

int arg;
if (!Int32.TryParse(someString, ref arg)) {
    Waaah;
}

Если бы TryParse принял параметр ref, это потребовало бы бесполезной инициализации.

Реальный вопрос в том, почему нет метода int? int.TryParse(string).

5 голосов
/ 29 февраля 2012

Вы используете out, чтобы указать, что параметр не используется, только установлен. Вызывающая сторона требуется для присвоения значения до возврата метода:

int n;
if (Int32.TryParse("47", out n)) { // Works fine; `n` will be set to the
  // ..                            // result of the parse.
}

Если вы используете ref, вам придется заранее инициализировать значение, что глупо, поскольку оно все равно будет перезаписано:

int n;
if (Int32.TryParse("47", ref n)) { // Kablammo! `n` isn't initialized.
  // ..
}

Именно в этом и заключается смысл TryParse: вы гарантированно получите значение в параметре out, которое представляет выходные данные попытки разбора. Возвращаемое значение true или false указывает, следует ли вам заботиться о результате или игнорировать его.

3 голосов
/ 29 февраля 2012

Это потому, что параметр out лучше соответствует тому, что делает метод.

Если он использовал параметр ref, то у вас есть для ввода данных в метод. Это не будет работать:

int arg;
if (Int32.TryParse(someString, ref arg)) { // error - variable is not initialsed

Метод не ожидает какого-либо ввода в параметре значения, если вам нужно будет указать входное значение, не очевидно, что это будет и как это будет использоваться.

0 голосов
/ 29 февраля 2012

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

Вопрос хороший, и я не думаю, что существует серьезная проблема с использованием одного или другого подхода.Команда .NET выбрала подход out, так как они не могли использовать оба без добавления отдельного метода к int, который был бы отвратительно избыточен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...