В чем разница между параметрами, объявленными с помощью var
, и параметрами, объявленными с помощью out
? Как компилятор обрабатывает их по-разному (например, генерируя другой код или изменяя диагностику, которую он выдает)? Или разные модификаторы просто позволяют программисту задокументировать предполагаемое использование параметров? Какое влияние на проблему оказывают типы параметров?
В чем разница между параметрами var и out?
Ответы (3)
Параметр var
будет передан по ссылке, и все.
Параметр out
также передается по ссылке, но предполагается, что входное значение не имеет значения. Для управляемых типов (строки, интерфейсы и т. Д.) Компилятор будет обеспечивать это, очищая переменную перед запуском подпрограммы, что эквивалентно записи param := nil
. Для неуправляемых типов компилятор реализует out
идентично var
.
Обратите внимание, что очистка управляемого параметра выполняется на сайте вызова, и поэтому код, сгенерированный для функции, не зависит от параметров out
или var
.
out
важен для параметров интерфейса внешних функций, потому что другой (не Delphi) код может вызвать его с мусорным значением. Но если единственная разница между var
и out
заключается в том, как компилятор обрабатывает вызывающую сторону, а вызывающая сторона не находится в Delphi в сценарии Serg, тогда я не понимаю, в чем различие Serg пытаюсь указать.
- person Rob Kennedy; 25.01.2013
out
params, тем больше мне интересно. Нет необходимости обнулять параметр out
вне процедуры в собственном коде Delphi, и я не мог понять, как текущая реализация параметров out
может помочь навести мост к другим языкам, которые по-разному трактуют параметры out
типа интерфейса.
- person kludg; 25.01.2013
out
на var
, но оставите все остальное без изменений, перестанет ли он работать?
- person Mason Wheeler; 26.01.2013
SHChangeNotification_Lock
неверно. Это описано в отчете о контроле качества. Изменение out
на var
для объявления в этом ответе ничего не меняет. Вы можете посмотреть на сгенерированный код и убедиться, что он идентичен. Не знаю, почему вы там приняли свой ответ, потому что он в корне неверен, по крайней мере, в отношении SHChangeNotification_Lock
.
- person David Heffernan; 26.01.2013
Для компилятора особой разницы нет. См. ответ Мейсона для этого.
Семантически большая разница:
var
сообщает программисту, что подпрограмма может работать со своим текущим значением,out
сообщает программисту, что подпрограмма проигнорирует / отбросит свое текущее значение.
out
в Delphi работает так же, как out
в C #, где незаконно читать параметр до его записи. Когда люди объявляют out
параметры в Delphi, я думаю, что обычно они намереваются относиться к ним именно так. Использование out
вместо var
служит для документирования этого намерения, даже если компилятор на самом деле не применяет его. Считывание параметра out
перед записью в него является ошибкой и ошибкой, даже если компилятор не помечает это как ошибку.
- person Rob Kennedy; 25.01.2013
out
для документирования своего намерения. Но когда я сталкиваюсь с функцией с параметром out, мне нужно пойти и проверить.
- person David Heffernan; 25.01.2013
out
, говорит программисту, что бесполезно подготавливать то, чем вы его кормите. Процедура с параметром var
требует подготовки и / или рассмотрения, out
- нет. Посоветуйте, пожалуйста, как переписать мой ответ, чтобы это было более ясно.
- person NGLN; 25.01.2013
out
параметры, вероятно, была написана для Delphi.NET или еще, но не для Delphi. Компилятор Delphi просто не может реализовать out
параметры в соответствии с документацией, и это вызывает вопросы, что такое out
параметры на самом деле и когда их следует использовать.
- person kludg; 25.01.2013
Немного поздно, но для протокола, я столкнулся со случаем, когда var или out имели большое значение.
Я работал над веб-службой SOAP, которая экспортировала следующий метод:
function GetUser( out User :TUser ) :TResult;
который импортировался в C # как эквивалент
function GetUser( out Result :TResult) :TUser;
когда я изменил out на var, он импортировал правильно.
Я предполагаю, что вызывающая программа Delphi SOAP обрабатывает результат функции как параметр out и что наличие двух параметров out сбивает с толку процедуры SOAP Delphi. Я не уверен, есть ли обходной путь, позволяющий использовать параметры out.
out
способ C #. Считывание выходного параметра до его полной инициализации недопустимо. И функция не может вернуться, если она полностью не инициализировала ее. И C # также получает правильную семантику возврата функций, что является еще одной моей ошибкой. - person David Heffernan   schedule 25.01.2013