我看到了兩種形式的代表:Func <string,string>和delegate有什麼區別?
A. Func<string, string> convertMethod = lambda
B. public delegate string convertMethod(string value);
我不確定究竟這兩者之間的區別是。他們都是代表嗎?我相信第一個會使用lambda表達式,第二個必須有一個方法來實際執行這個工作。我也可能會感到困惑。
我看到了兩種形式的代表:Func <string,string>和delegate有什麼區別?
A. Func<string, string> convertMethod = lambda
B. public delegate string convertMethod(string value);
我不確定究竟這兩者之間的區別是。他們都是代表嗎?我相信第一個會使用lambda表達式,第二個必須有一個方法來實際執行這個工作。我也可能會感到困惑。
首先,你的兩個實例的結果正在做兩件完全分開的事情。首先是聲明一個通用的委託變量併爲其賦值,其次是定義一個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)
將能夠保持同樣的方法定義。
至於你應該使用,取決於情況。如果你希望你的委託被更多的定義和返回,那麼泛型委託是完美的。如果你希望委託人有一些特殊的名字,可以給出委託人應該做什麼的更多定義(除了簡單的Action
,Predicate
等),那麼創建你自己的委託總是一個選項。
從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.
您也可以省略lambda中的參數。 ()=> Console.Writeline(「parameter less lambda」) –
Action test =()=> Console.Writeline(「parameter less lambda」); test.Invoke(); –
A初始化一個委託實例(可以立即調用)。這是一個類型爲Func < string,string>的變量。
B指定委託(它的簽名)的定義。它可用於稍後定義convertMethod類型的變量。
您所擁有的代碼示例有點讓人困惑,所以讓我嘗試清除它。以下兩項是委託申報。這些很容易發現,因爲它們總是包含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!!!
的可能重複的[手動聲明委託時,使用函數功能或動作?](http://stackoverflow.com/questions/4482613/declare-delegate-manually-use-funct -or-actiont) –
nawfal