2012-05-15 14 views
18

Powszechnym warunkiem, który powinny spełniać wszystkie programy, jest sprawdzenie, czy zmienne zostały przypisane, czy nie.Najlepszy sposób na sprawdzenie, czy zmienna jest zerowa?

Take poniższych stwierdzeń:

(1)

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

(2)

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

Jaka jest różnica między Assigned(Ptr) i Ptr <> nil?

+2

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

+0

"Co jest lepsze?" Jakie są twoje kryteria? –

+0

Wyniki mogą się różnić .. zobacz moją odpowiedź poniżej ... – Whiler

Odpowiedz

30

To zazwyczaj taka sama ... z wyjątkiem kiedy sprawdzić funkcję ...

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; 

Z drugiej składni, to sprawdzić wynik funkcji nie sama funkcja ...

5

Jeśli chodzi o wydajność, nie ma różnicy. Osobiście wolę drugą formę, ponieważ uważam, że ludzie mogą szybciej analizować znaczenie.

+11

Bardzo dziwny człowiek, który stwierdza, że ​​'<> zero' jest łatwiejszy do odczytania niż przypisany. Osobiście wolę dokładne przeciwieństwo z tego samego powodu. Innymi słowy myślę, że opcja 1 jest łatwiejsza do analizy. –

+0

Powiedziałabym też, że jeśli "Assigned" jest bardziej czytelny dla człowieka niż <> operandy. –

+2

Myślę, że powodem jest to, że na pierwszy rzut oka Assigned może być dowolnym starym wywołaniem funkcji. –

Powiązane problemy