Переменные в Delphi можно разделить на три типа
- Глобальные
- Локальные
- Поля объектов
Разные типы имеют свои особенности инициализация по умолчанию. Глобальные переменные — переменные которые объявлены в теле модуля всегда инициализируются автоматически. Например, числовые типы всегда будут равны нулю.
1 2 3 4 5 6 7 8 9 10 11 |
implementation {$R *.dfm} var GlobalVar: Integer; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(IntToStr(GlobalVar)); // 0 end; |
Локальные переменные — переменные объявленные внутри функций, процедур или методов не инициализируются автоматически. Их значение можно считать случайным. Например, следующий код будет выводить разное сообщение при каждом запуске программы
1 2 3 4 5 6 |
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 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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; |
Выводы
Глобальные и локальные перемеренные обязательно нужно инициализировать в явном виде, это позволяет избежать большого количества проблем и повышает читаемость.
Поля объектов можно инициализировать в конструкторе. Это обязательно нужно делать для некоторых типов, например, для Variant, так как по умолчанию они равны Unassigned. Для строк и чисел особого смысла в инициализации нулями и пустыми строками нет, возможно, для унификации.
Ссылки
Раздел документации про переменные.