Davi Eduardo Borges Wall wrote:
> Eu ainda diria para você tomar de costume sempre que possível
> inicializar variáveis. É uma boa prática de programação e
> evita problemas futuros.

Toda variável deve ser inicializada, sempre. Se ela for definida no 
corpo da unit (fora de um método, função ou procedimento), ela 
atualmente é pré-inicializada mas isso pode mudar em versões futuras do 
compilador. Se ela for definida dentro de uma rotina, ela é alocada no 
stack e virá com a tralha que já havia naquela região da memória.

No caso de campos de um record, eles são parte da própria variável e 
certamente seguem as mesmas regras. No caso de membros de uma classe, o 
construtor da classe (mais precisamente o método TObject.NewInstance) 
faz a limpeza implicitamente. Quando você:

TNovaClasse = class(TObject)
private
   FValue: Integer;
   FUmPonteiro: Pointer;
end;

ao criar uma instância de TNovaClasse você pode se assegurar de que 
FValue sempre será zero e que FUmPonteiro sempre será nil. Sempre. Em 
qualquer versão do compilador (Delphi ou FPC) atual ou futura. Por sinal 
eu costumo usar muita carga sob demanda, e uso esse truque aqui:

TCarga = class(TObject)
private
   FEncaps: TEncaps;
   function GetEncaps: TEncaps;
public
   destructor Destroy; override;
   property Encaps: TEncaps read GetEncaps;
end;

...

function TCarga.GetEncaps: TEncaps;
begin
   if not Assigned(FEncaps) then
     FEncaps := TEncaps.Create;
   Result := FEncaps;
end;

destructor TCarga.Destroy;
begin
   FEncaps.Free;
   inherited;
end;

Note que não existe create, que eu testo FEncaps sem inicializá-lo, que 
eu chamo FEncaps.Free sem saber se ele foi ou não foi criado, e isto é 
100% seguro. Mas isto é apenas dentro de uma classe. Maravilhas da OOP.

Meus $ 0,02

Joao Morais

Responder a