Каково значение по умолчанию "Результат" в Delphi?

Есть ли гарантированное значение по умолчанию для переменной Result для функции, например 0, '' или nil? Или должен ли результат всегда инициализироваться перед использованием?

У меня есть функция, возвращающая строку следующим образом:

function Foo(): String
begin
    while {...} do
    Result := Result + 'boingbumtschak';
end;

Он работал нормально, но теперь я получаю некоторые строки, содержащие содержимое предыдущего вызова функции. Когда я добавляю Result := '' в начале, это нормально. Когда я должен инициализировать переменную Result, и когда мне это не нужно? (строки, примитивы, экземпляры класса (ноль))

Ответ 1

Возвращаемое значение функции типа string фактически обрабатывается компилятором как неявный параметр var. Когда функция начинает выполнение, переменная Result содержит все, что находится в локальной переменной, которой впоследствии будет присвоено возвращаемое значение.

Соответственно, вы всегда должны инициализировать возвращаемые значения функции. Этот совет содержит не только строки, но и для всех типов данных.

Этот вопрос обсуждался только вчера здесь, в Переполнение стека.

Ответ 2

Если функция выходит без присвоение значения результату или имя функции, то функция возвращаемое значение undefined.

см. Справочник по Delphi > Процедуры и функции > a href= "http://docwiki.embarcadero.com/RADStudio/en/Procedures_and_Functions#Function_Declarations" rel= "noreferrer" > Объявления функций

Ответ 3

Я не знаю, что это такое в Delphi, но я всегда инициализирую переменные в здравом значении, прежде чем выполнять над ними операции (даже если это нормальное значение null, что вполне может быть в некоторых ситуациях), Много раз он был ненужным, но в этих случаях я рассчитываю, что компилятор или JITter оптимизируют назначение, если он захочет, вместо того, чтобы полагаться на потенциально недокументированную семантику языка или детали реализации компилятора. Возможно, это мой опыт работы на C, который сам по себе практически ничего не гарантирует начальных значений, но стоит потратить лишнюю одну строку кода (самое большее), чтобы получить более четкий код. Явным образом присваивая значение перед началом работы над переменной, вы устанавливаете четкий контракт с тем, кто читает код; они могут доверять тому, что их представление о том, что означает начальное значение переменной, действительно имеет место.

Что касается этого конкретного вопроса, не является Result предположительно функционально-локальным по охвату? Я был бы очень удивлен, если бы такая переменная, даже специальная, сохраняла значения из предыдущих вызовов функции.