Diciamo che abbiamo questa classe:Chiusure - Differenza tra catturare le variabili e la loro lettura come argomenti
// Provides deferred behaviour
public class Command<TResult>
{
private Func<object[], TResult> _executeFunction;
private object[] _args;
public Command(Func<object[], TResult> execution, params object[] arguments)
{
_executeFunction = execution;
_args = arguments;
}
public TResult Execute()
{
return _executeFunction(_args);
}
}
Qual è la differenza tra queste due funzioni anonime?
int a = 1;
int b = 4;
// a and b are passed in as arguments to the function
Command<int> sum = new Command<int>(args => (int)args[0] + (int)args[1], a, b);
// a and b are captured by the function
Command<int> sum2 = new Command<int>(_ => a + b);
Console.WriteLine(sum.Execute()); //Prints out 5
Console.WriteLine(sum2.Execute()); //Prints out 5
Sono specificamente alla ricerca di differenze di prestazioni.
Inoltre, sappiamo che se una classe è in possesso di un riferimento di sum2
, poi a
e b
vivranno al di là del campo di applicazione sono stati definiti in poi, probabilmente mai ottenere raccolti dal GC se la funzione è ancora riferimento da nessuna parte.
Succede lo stesso con sum
? (Considerando gli argomenti sono tipi di riferimento e non valori come in questo esempio)