程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C# 2.0的Specification(匿名方法)(一)(7)

C# 2.0的Specification(匿名方法)(一)(7)

編輯:關於C語言

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); });
    ...
  }
}

由於兩個匿名方法委托具有被捕獲外部變量的相同集合(都為空),並且由於匿名方法在語義上是相同的,所以允許編譯器產生引用同一目標方法的委托。實際上,這裡允許編譯器從兩個匿名方法表達式返回相同的委托實例。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved