2009-11-20 63 views
2

這是一個術語問題。在C#中,我可以這樣做:在C#中這種用法的名稱是什麼?

delegate Stream StreamOpenerDelegate(String name); 

void WorkMethod(StreamOpenerDelegate d) 
{ 
    // ... 
} 

void Exec1() 
{ 
    WorkMethod((x) => 
     { 
      return File.OpenRead(x); 
     }); 
} 

void Exec2() 
{ 
    StreamOpenerDelegate opener = (x) => 
     { 
      return File.OpenRead(x); 
     }; 

    WorkMethod(opener); 
} 

Q1
的Exec1()方法演示了使用匿名委託,正確的?

Q2
內Exec2(),將opener 被認爲是匿名委託?它確實有有一個名字。如果它不是一個匿名代理,我該怎麼稱呼它?這個語法有沒有名字? 「名爲匿名代表?」一個局部變量持有匿名委託?

回答

15

Q1:有作爲「匿名委託」沒有這樣的條款(C#語言規範) - 但這採用了lambda expression這是一種匿名函數的。有關詳細信息,請參閱C#語言規範的第7.14節。

Q2:opener是一個變量。該變量被分配一個使用lambda表達式創建的值。創建後,代表只是StreamOpenerDelegate的一個實例。換句話說,lambda表達式,匿名函數和匿名方法的概念是源代碼概念而不是執行時間的概念。 CLR不關心你如何創建代表。

順便說一句,無論你的lambda表達式可以更簡潔地表達 - 更少的括號等:

void Exec1() 
{ 
    WorkMethod(x => File.OpenRead(x)); 
} 

void Exec2() 
{ 
    StreamOpenerDelegate opener = x => File.OpenRead(x); 
    WorkMethod(opener); 
} 

或者你可以只使用一個方法組轉換

StreamOpenerDelegate opener = File.OpenRead; 
+0

非常好,很高興知道,謝謝。 – Cheeso

10

否和否。

A1:此功能是C#3.0新增功能,稱爲lambda表達式。 C#2.0有一個類似的功能,稱爲匿名方法;例如:

button.Click += delegate { 
    //code 
}; 

A2opener是一個普通的可變恰好保持lambda表達式。

順便說一句,只需要一個參數的lambda表達式不需要括號。此外,僅由return語句組成的lambda表達式不需要大括號。

例如:

StreamOpenerDelegate opener = x => File.OpenRead(x); 
+0

謝謝, 很有幫助。 – Cheeso