Differenze tra un parametro per valore e per riferimento

Completato

È possibile passare i parametri per valore o per riferimento. Ogni metodo offre vantaggi specifici.

Passaggio dei parametri per valore

Quando si passa un parametro per valore, si passa il valore di una variabile a una procedura. Questo metodo viene usato sempre come impostazione predefinita con i tipi fondamentali.

Nell'esempio successivo, la funzione MyFunction ottiene un parametro di tipo Integer, ne modifica il valore e restituisce il valore di paramA. L'istruzione Exit restituisce il valore pertinente.

trigger OnRun()
var
    myInteger : Integer;
    myResult : Integer;
begin
    myInteger := 23;
    myResult := MyFunction(myInteger);

    Message('myInteger: %1', myInteger);  // Displays 23
    Message('myResult: %1', myResult);    // Displays 17
end;

procedure MyFunction(paramA : Integer) : Integer
begin
  paramA := 17;
  Exit(paramA);
end;

Il valore di myInteger rimane 23, anche dopo l'esecuzione della procedura MyFunction.

Passaggio dei parametri per riferimento

Una variabile effettua sempre l'allocazione di una certa parte della memoria del computer. Quando si passa un parametro per riferimento, non si passa il valore a una procedura ma piuttosto al riferimento, che è la sua posizione in memoria. Usando questo metodo si lavora direttamente in memoria. Di conseguenza, la modifica di tale valore ha un impatto anche sulla procedura di chiamata. Per passare un parametro per riferimento, è necessario aggiungere la parola chiave var davanti a un parametro.

trigger OnRun()
var
    myInteger : Integer;
    myResult : Integer;
begin
    myInteger := 23;
    myResult := MyFunction(myInteger);

    Message('myInteger: %1', myInteger);  // Displays 17
    Message('myResult: %1', myResult);    // Displays 17
end;

procedure MyFunction(var paramA : Integer) : Integer
begin
  paramA := 17;
  exit(paramA);
end;

Come restituire tipi complessi

Ora è possibile semplificare il codice AL e restituire tipi complessi, anziché passarli nei parametri del metodo.

Ad esempio, il metodo seguente prende un nome e restituisce il primo record cliente che corrisponde al nome. Notare come la firma specifica il tipo di reso alla fine della dichiarazione della procedura e come la procedura termina restituendo il record del cliente trovato.


procedure GetCustomerByName(Name: Text): record Customer;
var
    Customer: record Customer;
begin
    Customer.SetFilter(Name, '@' + Name + '*');
    Customer.FindFirst();
    exit(Customer);
end;

È possibile usare questa nuova funzionalità per chiamare i membri direttamente sulla variabile restituita, ad esempio nelle espressioni.

Ad esempio, è possibile usare quanto sopra in un'istruzione IF:
if GetCustomerByName('SomeName')."Balance (LCY)" > 0 then.

Altri esempi su come restituire tipi complessi sono disponibili qui:

Come restituire il tipo complesso