Автоматическая инициализация переменных в Delphi

Переменные в Delphi можно разделить на три типа

  • Глобальные
  • Локальные
  • Поля объектов

Разные типы имеют свои особенности инициализация по умолчанию. Глобальные переменные — переменные которые объявлены в теле модуля всегда инициализируются автоматически. Например, числовые типы всегда будут равны нулю.

implementation

{$R *.dfm}

var
  GlobalVar: Integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(GlobalVar)); // 0
end;
1
2
3
4
5
6
7
8
9
10
11

Локальные переменные — переменные объявленные внутри функций, процедур или методов не инициализируются автоматически. Их значение можно считать случайным. Например, следующий код будет выводить разное сообщение при каждом запуске программы

procedure TForm1.Button2Click(Sender: TObject);
var
  LocalVar: Integer;
begin
  ShowMessage(IntToStr(LocalVar)); // 345342 или другие случайное число
end;
1
2
3
4
5
6

Опаснее всего ситуация с объектными типами.

procedure TForm1.Button2Click(Sender: TObject);
var
  LocalVar: TObject;
begin
  ShowMessage(BoolToStr(LocalVar = nil, True));  // False
end;
1
2
3
4
5
6

В переменной находится случайны адрес, следовательно вызов методов и изменение полей приведёт к непредсказуемым результатам.

Поля объекта инициализируются также как глобальные переменные, причём до того как начнёт выполнятся код из конструктора.

type
  TMyClass = class
    FVar: Integer;
    constructor Create;
  end;

{ TMyClass }

constructor TMyClass.Create;
begin
  ShowMessage(IntToStr(FVar)); // 0
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  Obj: TMyClass;
begin
  Obj := TMyClass.Create;
  FreeAndNil(Obj);
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Выводы

Глобальные и локальные перемеренные обязательно нужно инициализировать в явном виде, это позволяет избежать большого количества проблем и повышает читаемость.

Поля объектов можно инициализировать в конструкторе. Это обязательно нужно делать для некоторых типов, например, для Variant, так как по умолчанию они равны Unassignedopen in new window. Для строк и чисел особого смысла в инициализации нулями и пустыми строками нет, возможно, для унификации.

Ссылки

Раздел документацииopen in new window про переменные.

Последниее изменение: 24.08.2023, 06:42:55