function TWLM_.Send(const Msg: WideString; out Answer: WideString) : Integer;
begin
Result := fmProduction.AnalyzeData(Msg, 0);
end;
Здесь вы ничего не назначаете параметру Answer
.Это передается как параметр out
, означающий, что метод должен назначить что-то ему.Это ведет себя точно так же, как возвращаемое значение функции.
Если вы ничего не назначите этой переменной, она будет иметь любое (неназначенное) значение, которое существовало в стеке в тот момент, когда метод выделил для него пространство стека.Это не будет действительный указатель на WideString
, но потребительский код попытается упорядочить его, как если бы он был.Иногда это происходит сразу же, иногда нет, иногда может просто повредить другие данные.В любом случае это ошибка.
В нативном коде Delphi вы можете использовать параметры out
и var
, ведущие себя примерно одинаково - в обоих случаях для ссылочных типов указатель вызывающего кода доступен для чтения изапись методом, принимающим параметр.Если метод решает не изменять значение, это не требуется.Однако при управляемом взаимодействии ожидается, что метод всегда будет назначать параметр out
.C # обеспечивает это, а Delphi - нет.
В этом случае пустая строка, которую вы передали на стороне C #, вообще не передается методу - вы можете ожидать, что она останется пустой строкой, не измененной кодом Delphi, но сделавпараметр, параметр out
, вызывающий код ожидает получить возвращаемое значение в этом параметре и немедленно перезаписывает переданную переменную тем, что возвращается (в данном случае указателем на бессмыслицу).Любое значение, которое переменная на стороне C # могла иметь до передачи этому методу, будет, по расширению, недоступно на стороне Delphi / COM.