Автоматическая инициализация переменных в Delphi
Переменные в Delphi можно разделить на три типа
- Глобальные
- Локальные
- Поля объектов
Разные типы имеют свои особенности инициализация по умолчанию. Глобальные переменные — переменные которые объявлены в теле модуля всегда инициализируются автоматически. Например, числовые типы всегда будут равны нулю.
implementation
{$R *.dfm}
var
GlobalVar: Integer;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(GlobalVar)); // 0
end;
2
3
4
5
6
7
8
9
10
11
Локальные переменные — переменные объявленные внутри функций, процедур или методов не инициализируются автоматически. Их значение можно считать случайным. Например, следующий код будет выводить разное сообщение при каждом запуске программы
procedure TForm1.Button2Click(Sender: TObject);
var
LocalVar: Integer;
begin
ShowMessage(IntToStr(LocalVar)); // 345342 или другие случайное число
end;
2
3
4
5
6
Опаснее всего ситуация с объектными типами.
procedure TForm1.Button2Click(Sender: TObject);
var
LocalVar: TObject;
begin
ShowMessage(BoolToStr(LocalVar = nil, True)); // False
end;
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;
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 про переменные.