などの変数をキャプチャし、それらを読み違いのは、我々は、このクラスを持っているとしましょう:クロージャ - 引数
// 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);
}
}
これら二つの無名関数の違いは何ですか?
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
特にパフォーマンスの違いを探しています。
はまた、我々はいくつかのクラスがsum2
の参照を保持している場合、a
とb
は、機能がまだどこにも参照されている場合は、おそらくGCによって回収されなくなっ決して、彼らは上に定義された範囲を超えて生きることを知っています。
sum
と同じことが起こりますか? (引数は参照型であり、この例のように値の型ではないと考えてください)