В чем разница между параметрами «var» и «out»?

46

Какая разница между параметрами, объявленными с помощью var и объявленными с помощью out? Как компилятор обрабатывает их по-разному (например, генерируя другой код или изменяя, какие диагностические данные он выдает)? Или различные модификаторы просто позволяют программисту документировать предполагаемое использование параметров? Какое влияние оказывают типы параметров на этот вопрос?

  • 7
    У меня всегда был один и тот же вопрос, и я не удосужился его задать.
  • 0
    Я тоже. Я действительно столкнулся с этой проблемой , поэтому я хотел бы получить действительно хороший ответ на этот вопрос.
Показать ещё 9 комментариев
Теги:
parameters
pass-by-reference

3 ответа

36
Лучший ответ

A var параметр будет передан по ссылке и что он.

Параметр out также передается по ссылке, но он предположил, что входное значение не имеет значения. Для управляемых типов (строки, интерфейсы и т.д.) Компилятор будет применять это, очищая переменную до начала процедуры, эквивалентную записи param := nil. Для неуправляемых типов компилятор реализует out идентично var.

Обратите внимание, что очистка управляемого параметра выполняется на сайте вызова, поэтому код, сгенерированный для функции, не изменяется с параметрами out или var.

  • 0
    Этот ответ был приятным и простым, но теперь я прочитал (удаленный) ответ Серга и снова запутался. Он говорит out это важно для параметров интерфейса внешних функций, потому что другой (не Delphi) код может вызывать его с «мусорным значением». Но если единственное различие между var и out заключается в том, как компилятор обрабатывает вызывающую сторону, а вызывающая сторона не в Delphi в сценарии Serg, тогда я не понимаю, на какое отличие Serg пытается указать.
  • 1
    @ Роб, я думаю, что Сергей немного запутался здесь. Он понял это прямо в своем блоге: sergworks.wordpress.com/2012/10/01/…
Показать ещё 9 комментариев
6

Для компилятора нет большой разницы. Для этого см. Мейсон.

Семантически существует большая разница:

  • var сообщает программисту, что подпрограмма может работать с ее текущим значением,
  • out сообщает программисту, что подпрограмма игнорирует/отбрасывает текущее значение.
  • 1
    Ваш второй пункт является точным только для управляемых типов.
  • 8
    @ Дэвид, этот ответ касается документации, а не фактического поведения. Я думаю, что большинство людей обычно предполагают, что out в Delphi работает так же, как out в C #, где считывание параметра до его записи является незаконным. Когда люди заявляют , out параметров в Delphi, я думаю , что, как правило , как они намерены их лечить. Использование out вместо var служит для документирования этого намерения, даже если компилятор фактически не применяет его. Чтение параметра out перед записью в него является ошибкой и ошибкой, даже если компилятор не помечает его как ошибку.
Показать ещё 6 комментариев
1

Немного поздно, но только для записи, я наткнулся на случай, когда var или out сделал большую разницу.

Я работал над веб-службой SOAP, которая экспортировала следующий метод:

function GetUser( out User :TUser ) :TResult;

который импортировался в С# в качестве эквивалента

function GetUser( out Result :TResult) :TUser;

когда я изменил out на var, он импортировал его правильно.

Я предполагаю, что вызов Delphi SOAP рассматривает результат функции как параметр out, а наличие двух параметров out смущает подпрограммы Delphi SOAP. Я не уверен, есть ли временное решение, позволяющее использовать параметры out.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню