2009-05-14 7 views
2

Я реализую метод TryParse (строка s, Out object result). Если синтаксический анализ не удается, я не хочу касаться параметра out, поэтому любой предыдущий результат останется неизменным. Но VS2k8 меня не пускает. Я должен установить значение объекта out независимо от того, что.Какое значение должно иметь значение out с неуспешным методом TryXX()?

Должен ли я просто поставить результат = результат ради удовольствия компилятора? Я что-то упускаю?

ответ

6

Ваше предложение о result = result не будет работать, потому что это out параметр - это не определенно присвоенной, чтобы начать с, так что вы не можете прочитать его значение, пока вы не присваивается значение для него.

result = null; 

, безусловно, правильный путь для параметра object из. В основном используйте default(T) для любого типа T у вас есть. (Оператор default полезен в общих методах - для нестандартного кода я бы обычно использовал null, 0, что бы то ни было.)

РЕДАКТИРОВАТЬ: На основании комментария Бориса, возможно, стоит остановиться на различии между параметр ref и параметр out:

Out параметры

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

Ref параметры

  • У должно быть определенно присвоены вызывающим
  • рассматривается как «определенно присвоенные» в начале метода (так что вы можете прочитать значение без его назначения в первую очередь)
  • Не нужно назначать внутри метода (т. е. вы можете оставить параметр с его исходным v alue)
+0

Итак, это общепринятая процедура для перезаписывания любого значения, которое было выбрано в первую очередь? –

+1

Это больше, чем принято: требуется. Параметр out * обязательно должен быть определен до того, как метод завершится нормально (то есть возвращает, а не бросает) –

+0

Невозможно сделать иначе. Это то, что означает «выход» - ценность клиента будет (над) написана. Преимущество «out» над «ref» заключается в том, что клиенту не нужно беспокоиться о инициализации переменной, он может просто объявить об этом, заверил, что какое-то «начальное» значение будет установлено при передаче в позицию «out». – Brian

2
result = null; 
+0

Тогда я бы прикоснулся к параметру. Это в основном говядина моего вопроса. –

7

Назначить нулевой (или по умолчанию (T) в целом). Вы должны назначить значение, вот что означает «выход».

+0

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

+0

Вы можете сделать это с помощью параметра 'ref', но тогда вы отходите от того, что (к лучшему или к худшему) становится «стандартной идиомой». – Brian

+0

@boris - резервное значение по умолчанию (T) безопасно. Как правило, вызывающий код не должен даже смотреть на это значение, если им присваивается 'false'. –

0

Просто поместите значение по умолчанию. Например, метод Int32.TryParse ставит ноль.

+0

Значение по умолчанию означает, что значение по умолчанию (T) является точным, верно? – Kirtan

+0

Для типичного типа, который был бы правильным –

-3

Вы можете создать исключение перед кодом, который должен установить результат.

+4

Метод TryParse на самом деле не должен генерировать исключение в случае неправильного анализа. Это, вероятно, будет рассматриваться как нарушение неявного контракта –

0

Вы можете использовать ref вместо out, если вы не хотите назначать значение, хотя это должно быть инициализировано вызывающим.

 Смежные вопросы

  • Нет связанных вопросов^_^