Skip to content

Delphi 10.4, Custom Managed Records

Ya se comienzan a conocer algunos detalles de la nueva versión de Rad Studio, Delphi 10.4 que todavía no tiene fecha de lanzamiento.

Marco Cantú, gerente de producto de Embarcadero, nos comenta que la próxima versión 10.4 de Rad Studio incluirá una característica muy esperada por los desarrolladores en Delphi, se trata de declarar registros con procedimientos de inicialización, finalización y asignaciones personalizadas.

¿Qué es un Custom Managed Records?

Sabemos que los registros en Delphi pueden contener campos de cualquier tipo de datos. El compilador de Delphi no hace mucho más que asignar o eliminar ubicaciones de la memoria cuando se declaran campos simples (no administrados) como los son los valores numéricos, teniendo en cuenta que Delphi no inicializa los registros.

En cambio, si un registro posee un campo administrado, como por ejemplo, una cadena o una interfaz, el compilador agrega un código adicional para administrar la inicialización y finalización del mismo.

Lo que agrega es un bloque try-finally alrededor de nuestro código para asegurarse de que los datos se borren de memoria, incluso en caso de una excepción.

En conclusión, los registros administrados has sido parte de Delphi desde hace ya mucho tiempo.

Inicialización y finalización de Registros

En la nueva versión, 10.4 de Delphi, los registros admitirán procedimientos de inicialización y finalización personalizadas, más allá de lo que el compilador seguirá realizando.

Estos procedimientos de inicialización y finalización se realizan con nuevos operadores agregados en esta versión, como lo mostramos en el siguiente ejemplo:

type
  TMyRecord = record
    Value: Integer;
    class operator Initialize(out Dest: TMyRecord);
    class operator Finalize(var Dest: TMyRecord);
  end;

Una vez declarado el registro, debe declarar los dos métodos, Initialize y Finalize, como lo mostramos a continuación:

class operator TMyRecord.Initialize (out Dest: TMyRecord);
begin
  Dest.Value := 55;
  Log('creado ' + IntToHex (Integer(Pointer(@Dest)))));
end;

class operator TMyRecord.Finalize(var Dest: TMyRecord);
begin
  Log('destruido' + IntToHex (Integer(Pointer(@Dest)))));
end;

La diferencia entre versiones anteriores y ésta, es la invocación automática de estos métodos.

Por ejemplo, si colocamos el siguiente código:

begin
  var t: TMyRecord; 
  Log (t.Value.ToString);
end;

Obtendremos algo como lo siguiente:

creado 0023F5A9 
55
destruido 0023F5A9

Esta es una gran característica en la nueva versión que Embarcadero esta a punto de lanzar, falta mucho por ver de los Custom Managed Records, y estaremos explicándolo en próximos artículos.