21.6匿名方法計算
匿名方法表達試的運行時計算產生一個引用匿名方法的委托實例,並且被捕獲的外部變量的集合(可能為空)在計算時(the time of the evaluation)是活躍的(active)。當由匿名方法表達式所產生的委托被調用時,匿名方法體就會執行。方法體內的代碼將使用由該委托引用而被捕獲的外部變量執行。
由匿名方法表達時產生的委托調用列表包含一個單一入口。該委托的確切目標對象和目標方法都是未指定的。需要特別的注意的是,委托的目標對象是否為null,以及封閉函數成員的this值,或其他對象都是未指定的。
語義上相同的匿名方法的計算,如果它們帶具有相同被捕獲的外部變量集合(可能為空),可以(但不是必須)返回相同的委托實例。術語“語義上相同”用在這裡,意思是說,該匿名方法的執行期在所有情況下,都產生給定相同實參的相同效果。這條規則允許如下的代碼優化。
delegate double Function(double x);
class Test
{
static double[] Apply(double[] a, Function f) {
double[] result = new double[a.Length];
for (int i = 0; i < a.Length; i++) result[i] = f(a[i]);
return result;
}
static void F(double[] a, double[] b) {
a = Apply(a, delegate(double x) { return Math.Sin(x); });
b = Apply(b, delegate(double y) { return Math.Sin(y); });
...
}
}
由於兩個匿名方法委托具有被捕獲外部變量的相同集合(都為空),並且由於匿名方法在語義上是相同的,所以允許編譯器產生引用同一目標方法的委托。實際上,這裡允許編譯器從兩個匿名方法表達式返回相同的委托實例。