2012-05-15 21 views
18

Una condición común que todos los programas deberían hacer es verificar si las variables están asignadas o no.¿La mejor manera de verificar si una variable es nula?

tomar las siguientes afirmaciones:

(1)

if Assigned(Ptr) then 
begin 
    // do something 
end; 

(2)

if Ptr <> nil then 
begin 
    // do something 
end; 

¿Cuál es la diferencia entre Assigned(Ptr) y Ptr <> nil?

+2

Ver el http://docwiki.embarcadero.com/Libraries/en/System.Assigned – TLama

+0

"¿Qué es mejor?" ¿Cuáles son tus criterios? –

+0

Los resultados pueden diferir .. vea mi respuesta a continuación ... – Whiler

Respuesta

30

Por lo general es el mismo ... excepto cuando se echa una función ...

function mfi: TObject; 
begin 
    Result := nil; 
end; 

procedure TForm1.btn1Click(Sender: TObject); 
type 
    TMyFunction = function: TObject of object; 
var 
    f: TMyFunction; 
begin 
    f := mfi; 

    if Assigned(f) then 
    begin 
    ShowMessage('yes'); // TRUE 
    end 
    else 
    begin 
    ShowMessage('no'); 
    end; 

    if f <> nil then 
    begin 
    ShowMessage('yes'); 
    end 
    else 
    begin 
    ShowMessage('no'); // FALSE 
    end; 
end; 

Con la segunda sintaxis, se comprobará el resultado de la función, no la propia función ...

5

En cuanto a rendimiento, no hay diferencia. Personalmente prefiero la segunda forma ya que los humanos pueden analizar el significado más rápido.

+11

Humano muy extraño que encuentra '<> nil' más fácil de leer que el asignado. Yo personalmente prefiero exactamente lo contrario por la misma razón. En otras palabras, creo que la opción 1 es más fácil de analizar. –

+0

También diría 'if Assigned' para ser más legible en humanos que en <> operandos. –

+2

Creo que la razón es que a primera vista Asignada puede ser cualquier llamada a una función anterior. –

Cuestiones relacionadas