![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Tu solución, fremen, es redundante (que no mala). Lo digo porque ya el método "Free" comprueba si el objeto existe (hay un "IF Self <> Nil", si no recuerdo mal), al igual que en FreeAndNil. Eso sí, el uso de FreeAndNil me gusta, y yo lo uso bastante, aunque no suelo poner el "IF Assigned" delante.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi! - BAScript - Multi Language Scriptable Development Environment |
|
#2
|
||||
|
||||
|
Yo creo que lo mas pragmatico es tener constructores y destructores simples (por lo general yo no redefino destructores). Si se tienen constructores simples que lo unico que hacen es asignar los valores que reciben, pero no crean objetos, entonces la forma #3 es totalmente segura
Con esto me refiero a que, en lugar de que un objeto cree un descendiente de TStream (lo cual puede tener complicaciones), mejor que lo reciba ya correctamente inicializado; de este modo, el no tendra que tambien ser responsable de saber como crear el stream, que hacer si no se puede crear, ni responsable de destruirlo |
|
#3
|
|||
|
|||
|
Cita:
|
|
#4
|
||||
|
||||
|
Cita:
|
|
#5
|
|||
|
|||
|
Cita:
Aunque veo sus ventajas a este patrón, a mi personalmente no me convence. Pero para gustos, colores. Y otra cosa no, pero colores en programación tenemos cientos... |
|
#6
|
|||
|
|||
|
Cita:
El porque del FreeAndNil. Código:
var
A1, A2: TTest;
begin
A2 := nil;
A1 := nil;
try
A1 := TTest.Create;
A2 := TTest.Create;
//Use A1 and A2
finally
if Assigned(A2) then FreeAndNil(A2);
A1.Free;
end;
// Aquí A2 siempre es Nil. Así, si tengo un descuido tal que...
A2.Propiedad_X := 1; // Genera excepción siempre y en el periodo de pruebas lo detecto a la primera
// Aquí A1 tiene un valor indeterminado.
A1.Propiedad_X := 1; // Según el estado de la memoria que apunte A1, unas veces generara excepción y otras no. Resultado: Errores aleatorios
end;
Código:
procedure FreeAndNil(var Obj);
{$IF not Defined(AUTOREFCOUNT)}
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil; => Error
Temp.Free;
end;
{$ELSE}
begin
TObject(Obj) := nil; => Error
end;
{$ENDIF}
|
|
#7
|
||||
|
||||
|
Este caso raro es más bien un caso erróneo: estás haciendo referencia a tus objetos A1 y A2 fuera del bloque try-except que está justamente para protegerlos. Además, la sección finally se usa para liberar los objetos por lo que es un error querer usarlos fuera de esa cláusula.
LineComment Saludos |
|
#8
|
|||
|
|||
|
Cita:
|
|
#9
|
||||
|
||||
|
Es que no es la forma de hacerlo. No necesitas "cazar un error" que tú mismo estás provocando. Simplemente no provoques ese error.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Recursos en Español para delphi 6 | GerTorresM | Varios | 2 | 04-01-2010 15:11:16 |
| Ayuda para completar código:Traducción de Delphi a Builder | Pernorak | C++ Builder | 3 | 30-05-2007 12:45:16 |
| Traduccion de recursos (VCL) | arm | Varios | 0 | 22-09-2004 13:11:09 |
| Recursos en castellano para Delphi 7 | xerkan | Varios | 1 | 05-03-2004 09:27:42 |
|