Какая разница между параметрами, объявленными с помощью var
и объявленными с помощью out
? Как компилятор обрабатывает их по-разному (например, генерируя другой код или изменяя, какие диагностические данные он выдает)? Или различные модификаторы просто позволяют программисту документировать предполагаемое использование параметров? Какое влияние оказывают типы параметров на этот вопрос?
A var
параметр будет передан по ссылке и что он.
Параметр out
также передается по ссылке, но он предположил, что входное значение не имеет значения. Для управляемых типов (строки, интерфейсы и т.д.) Компилятор будет применять это, очищая переменную до начала процедуры, эквивалентную записи param := nil
. Для неуправляемых типов компилятор реализует out
идентично var
.
Обратите внимание, что очистка управляемого параметра выполняется на сайте вызова, поэтому код, сгенерированный для функции, не изменяется с параметрами out
или var
.
out
это важно для параметров интерфейса внешних функций, потому что другой (не Delphi) код может вызывать его с «мусорным значением». Но если единственное различие между var
и out
заключается в том, как компилятор обрабатывает вызывающую сторону, а вызывающая сторона не в Delphi в сценарии Serg, тогда я не понимаю, на какое отличие Serg пытается указать.
Для компилятора нет большой разницы. Для этого см. Мейсон.
Семантически существует большая разница:
var
сообщает программисту, что подпрограмма может работать с ее текущим значением,out
сообщает программисту, что подпрограмма игнорирует/отбрасывает текущее значение.out
в Delphi работает так же, как out
в C #, где считывание параметра до его записи является незаконным. Когда люди заявляют , out
параметров в Delphi, я думаю , что, как правило , как они намерены их лечить. Использование out
вместо var
служит для документирования этого намерения, даже если компилятор фактически не применяет его. Чтение параметра out
перед записью в него является ошибкой и ошибкой, даже если компилятор не помечает его как ошибку.
Немного поздно, но только для записи, я наткнулся на случай, когда var или out сделал большую разницу.
Я работал над веб-службой SOAP, которая экспортировала следующий метод:
function GetUser( out User :TUser ) :TResult;
который импортировался в С# в качестве эквивалента
function GetUser( out Result :TResult) :TUser;
когда я изменил out на var, он импортировал его правильно.
Я предполагаю, что вызов Delphi SOAP рассматривает результат функции как параметр out, а наличие двух параметров out смущает подпрограммы Delphi SOAP. Я не уверен, есть ли временное решение, позволяющее использовать параметры out.