2012-05-15 19 views
18

Una condizione comune che tutti i programmi dovrebbero fare è verificare se le variabili sono assegnate o meno.Il modo migliore per verificare se una variabile è nulla?

Prendere le seguenti affermazioni:

(1)

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

(2)

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

Qual è la differenza tra Assigned(Ptr) e Ptr <> nil?

+2

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

+0

"Quale è meglio?" Quali sono i tuoi criteri? –

+0

I risultati possono differire .. vedi la mia risposta qui sotto ... – Whiler

risposta

30

Di solito è lo stesso ... tranne quando si controlla una funzione ...

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 seconda sintassi, controllerà il risultato della funzione, non la funzione stessa ...

5

Per quanto riguarda le prestazioni, non vi è alcuna differenza. Personalmente preferisco la seconda forma in quanto trovo che gli umani possano analizzare il significato più velocemente.

+11

Un umano molto strano che trova '<> nil' più facile da leggere di quanto assegnato. Personalmente preferisco l'esatto opposto per la stessa identica ragione. In altre parole, penso che l'opzione 1 sia più semplice da analizzare. –

+0

Direi anche "se assegnato" per essere più umano leggibile piuttosto che <> operandi. –

+2

Penso che il motivo sia che a prima vista Assigned può essere una qualsiasi chiamata di funzione vecchia. –

Problemi correlati