Какое значение out должно быть установлено при неудачном методе TryXX()?

StackOverflow https://stackoverflow.com/questions/862207

  •  21-08-2019
  •  | 
  •  

Вопрос

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

Стоит ли просто поставить result = result ради того, чтобы угодить компилятору?Я что-то пропустил?

Это было полезно?

Решение

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

result = null;

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

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

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

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

Справочные параметры

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

Другие советы

Присвойте значение null (или default(T) в более общем смысле).Вы должны присвоить значение, вот что означает «out».

result = null;

Просто укажите какое-нибудь значение по умолчанию.Например, метод Int32.TryParse помещает ноль.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top