Sto mettendo questo in una risposta separata perché il tuo EDIT rende la tua domanda davvero diversa.
Io probabilmente estendere questa risposta più tardi come io sono un po 'di fretta per arrivare a un client.
La modifica indica che è necessario rivedere i tipi di valori, i tipi di riferimento e l'effetto di var, out, const e nessun segno di parametri.
Facciamo la cosa tipi di valore prima.
I valori dei tipi di valore vivono nello stack e hanno un comportamento di copia su assegnazione. (proverò a includere un esempio in seguito).
Quando non è presente alcun parametro, il valore effettivo passato a un metodo (procedura o funzione) verrà copiato sul valore locale di tale parametro all'interno del metodo. Quindi il metodo non opera sul valore passato ad esso, ma su una copia.
Quando hai fuori, var o const, quindi nessuna copia avviene: il metodo farà riferimento al valore effettivo passato. Per var, permetterà di cambiare quel valore attuale, per const non lo permetterà. Per uscire, non sarai in grado di leggere il valore reale, ma potrai comunque scrivere il valore reale.
I valori dei tipi di riferimento risiedono nell'heap, quindi per loro non ha importanza se si ha, var, const o nessun segno di parametro: quando si modifica qualcosa, si modifica il valore sull'heap.
Per i tipi di riferimento, è ancora possibile ottenere una copia quando non è presente un contrassegno dei parametri, ma si tratta di una copia di un riferimento che punta ancora al valore sull'heap.
Ecco dove i metodi anonimi si complicano: fanno una cattura variabile. (Barry può probabilmente spiegarlo ancora meglio, ma ci proverò) Nel tuo caso modificato, il metodo anonimo catturerà la copia locale della Lista. Il metodo anonimo funzionerà su quella copia locale, e dal punto di vista del compilatore tutto è dandy.
Tuttavia, il punto cruciale della modifica è la combinazione di "funziona con parametri normali" e "che garantisce che il riferimento continui a puntare a un oggetto attivo ogni volta che viene eseguito il metodo anonimo".
Questo è sempre un problema con i parametri di riferimento, non importa se si utilizzano metodi anonimi o meno.
Per esempio questo:
procedure TMyClass.AddObject(Value: TObject);
begin
FValue := Value;
end;
procedure TMyClass.DoSomething();
begin
ShowMessage(FValue.ToString());
end;
Chi garantisce che quando qualcuno chiama DoSomething, che l'istanza in cui i punti di valore F esiste ancora? La risposta è che devi garantirlo da solo non chiamando DoSomething quando l'istanza di FValue è morta. Lo stesso vale per la tua modifica: non devi chiamare il metodo anonimo quando l'istanza sottostante è morta.
Questa è una delle aree in cui le soluzioni di riferimento contato o garbage collection rendono la vita più facile: c'è l'istanza sarà mantenuto in vita fino a quando l'ultimo riferimento ad esso è andato via (che potrebbero causare esempio per vivere più a lungo di quanto originariamente anticipato!).
Quindi, con la modifica, la domanda cambia in realtà dai metodi anonimi alle implicazioni dell'uso dei parametri tipizzati di riferimento e della gestione a vita in generale.
Speriamo che la mia risposta ti aiuti ad andare in quella zona.
- jeroen
Utilizzare il puntatore anziché i parametri di riferimento. – MajidTaheri