2011-07-25 55 views
43

我看到了兩種形式的代表:Func <string,string>和delegate有什麼區別?

A. Func<string, string> convertMethod = lambda 

B. public delegate string convertMethod(string value); 

我不確定究竟這兩者之間的區別是。他們都是代表嗎?我相信第一個會使用lambda表達式,第二個必須有一個方法來實際執行這個工作。我也可能會感到困惑。

+0

的可能重複的[手動聲明委託時,使用函數功能或動作?](http://stackoverflow.com/questions/4482613/declare-delegate-manually-use-funct -or-actiont) – nawfal

回答

39

首先,你的兩個實例的結果正在做兩件完全分開的事情。首先是聲明一個通用的委託變量併爲其賦值,其次是定義一個delegate類型。你的榜樣,更徹底,將是:

public static class Program 
{ 
    // you can define your own delegate for a nice meaningful name, but the 
    // generic delegates (Func, Action, Predicate) are all defined already 
    public delegate string ConvertedMethod(string value); 

    public static void Main() 
    { 
     // both work fine for taking methods, lambdas, etc. 
     Func<string, string> convertedMethod = s => s + ", Hello!"; 
     ConvertedMethod convertedMethod2 = s => s + ", Hello!"; 
    } 
} 

但更重要的是,無論是方法,匿名方法或lambda表達式都Func<string,string>delegate string convertMethod(string)將能夠保持同樣的方法定義。

至於你應該使用,取決於情況。如果你希望你的委託被更多的定義和返回,那麼泛型委託是完美的。如果你希望委託人有一些特殊的名字,可以給出委託人應該做什麼的更多定義(除了簡單的ActionPredicate等),那麼創建你自己的委託總是一個選項。

8

MSDN

在C#之前的版本2.0,聲明委託的唯一方法是 使用命名方法。 C#2.0引入了匿名方法,在C# 3.0及更高版本中,lambda表達式取代匿名方法作爲編寫內聯代碼的首選方式。

有一種情況,其中一個匿名方法提供的功能 在lambda表達式未找到。匿名方法使您可以省略參數列表 。這意味着匿名方法可以將 轉換爲具有各種簽名的委託。

您可能也有興趣在此SO回答於delegate keyword vs lambda expression

此外,MSDN具有good article on Lambda Expressions

delegate int del(int i); 
static void Main(string[] args) 
{ 
    del myDelegate = x => x * x; 
    int j = myDelegate(5); //j = 25 
} 

在前面的示例中,注意委託簽名具有int類型之一 隱式類型的輸入參數,並返回一個int。 lambda表達式可以轉換爲該類型的委託,因爲 它也有一個輸入參數(x)和 編譯器可以隱式轉換爲int類型的返回值。 (類型推斷 更詳細在下面的章節中討論)。當委託 是通過使用5的輸入參數調用時,它返回 25.

+0

您也可以省略lambda中的參數。 ()=> Console.Writeline(「parameter less lambda」) –

+0

Action test =()=> Console.Writeline(「parameter less lambda」); test.Invoke(); –

2

A初始化一個委託實例(可以立即調用)。這是一個類型爲Func < string,string>的變量。

B指定委託(它的簽名)的定義。它可用於稍後定義convertMethod類型的變量。

9

您所擁有的代碼示例有點讓人困惑,所以讓我嘗試清除它。以下兩項是委託申報。這些很容易發現,因爲它們總是包含delegate關鍵字

public delegate TReturn Func<TArg, TReturn>(Targ value); 
public delegate string convertMethod(string value); 

這行代碼被分配一個值到本地被輸入給代理人

Func<string, string> local = lambda; 

上面的代碼並不限於儘管只使用lambdas。該值也可以是兼容的方法組或另一個委託值。其他

一個項目需要注意的是,即使Func<string, string>convertMethod都具有相同簽名都代表他們的價值觀轉換到對方。例如,以下是非法

Func<string, string> local1 = ...; 
convertMethod local2 = local1; // Error!!! 
相關問題