Какое значение должно быть установлено с помощью неудачного метода TryXX ()? - PullRequest
2 голосов
/ 14 мая 2009

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

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

Ответы [ 6 ]

7 голосов
/ 14 мая 2009

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

6 голосов
/ 14 мая 2009

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

result = null;

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

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

Выходные параметры

  • Не должен быть обязательно назначен вызывающим абонентом
  • Обрабатываются как "не определенно назначенные" в начале метода (вы не можете прочитать значение, не присвоив его сначала, как локальная переменная)
  • Должно быть обязательно назначено (методом), прежде чем метод завершится нормально (то есть, прежде чем он вернется; он может выдать исключение, не назначая значение параметру)

Параметры Ref

  • Do должен быть точно назначен вызывающим абонентом
  • Обрабатываются как «определенно назначенные» в начале метода (так что вы можете прочитать значение, не назначая его первым)
  • Нет необходимости назначать в методе (т. Е. Вы можете оставить параметр с его исходным значением)
2 голосов
/ 14 мая 2009
result = null;
0 голосов
/ 14 мая 2009

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

0 голосов
/ 14 мая 2009

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

0 голосов
/ 14 мая 2009

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

...