C # предоставляет ключевое слово ref
and out
для аргументов, передаваемых по ссылке. Семантика двух очень похожа. Единственная разница заключается в инициализации переменной:
ref
требует, чтобы переменная была инициализирована перед передачей функции,out
нет.out
требует, чтобы переменная была инициализирована внутри функции,ref
нет.
Варианты использования этих двух ключевых слов также почти одинаковы, и их слишком частое использование, как я полагаю, считается запахом кода (хотя существуют допустимые варианты использования, такие как шаблоны TryParse
and TryGetValue
).
Из-за этого кто-то может объяснить, почему в C # есть два очень похожих инструмента для столь узких вариантов использования?
Также в MSDN указано, что у них другое поведение во время выполнения:
Хотя ключевые слова ref и out вызывают различное поведение во время выполнения, они не считаются частью сигнатуры метода во время компиляции.
Чем отличается их поведение во время выполнения?
Вывод
Оба ответа выглядят правильно, спасибо вам обоим. Я принял Jmoreno , потому что это более явно.
ref
в C ++; указатели на указатель объекта (или примитив) в вопросе. т.е.Int32.TryParse(myStr, out myInt)
(C #) «выполняется» так же, какint32_tryParse(myStr, &myInt)
(C); единственное отличие заключается в том, что компилятор налагает некоторые ограничения на предотвращение ошибок. (Я не собираюсь публиковать это как ответ, потому что я могу ошибаться из-за того, как это работает за кулисами, но я думаю, что это работает [потому что это имеет смысл])