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