2009-08-21 48 views

回答

23

假設你有一個函數,例如:

private static string toLower(string s) 
{ 
    return s.ToLower(); 
} 

有System.Func的一個版本,有兩個通用的參數,第一個是第一個參數的類型,第二個是返回類型。因此,你可以寫:

Func<string,string> myFunction = toLower; 
string s = myFunction("AsDf"); 
// s is now "asdf" 

在System.Func的所有版本,最後一個通用的說法是返回類型,所有的人都在參數類型,爲了。

System.Func是有用的,因爲它不需要您編寫自定義委託類型。這使得代理簽名相同變得更容易。

說我有:

public delegate string MyDelegate1(string s); 
public delegate string MyDelegate2(string s); 

MyDelegate1 myDel = new MyDelegate1(toLower); // toLower as above 

現在有沒有辦法CONVER我MyDelegate1委託類型MyDelegate2的對象,即使他們有相同的方法簽名。在另一方面,如果我們使用,而不是宣佈自定義委託類型Func鍵,我們就沒有這個問題

5

System.Func<T>通常被用作一個參數傳遞給另一功能。它可以是任何返回值爲T的委託 - 並且有多個版本可用作具有多個參數的委託。

一個常見用法是用於過濾 - 例如,在LINQ中,您可以傳遞一個函數以用作Enumerable.Where函數中的過濾器來限制集合。例如:

public bool FilterByName(string value) 
{ 
    return value.StartsWith("R"); 
} 

// .. later 

List<string> strings = new List<string> { "Reed", "Fred", "Sam" }; 

var stringsStartingWithR = strings.Where(FilterByName); 

然而,在上述情況下,你會更容易使用lambda表達式的基礎上繼續飛Func<string,bool>,如:

var stringsStartingWithR = strings.Where(s => s.StartsWith("R")); 
+0

技術上,。凡()請求一個謂詞委託。但既然這只是Func的一個特例,你沒關係。 – 2009-08-21 19:23:15

+4

喬爾:沒有。 Enumerable.Where(Of(TSource))(IEnumerable(Of(TSource)),Func(Of(TSource,Boolean)))請參閱:http://msdn.microsoft.com/zh-cn/library/system.linq。 enumerable.where.aspx – 2009-08-21 19:26:55

+0

它具體定義爲Func 2009-08-21 19:27:52

2
void Foo() 
{ 
    Func<object, bool> func = Bar; 
    bool b1 = func(new object()); // b1 is true 
    bool b2 = func(null); // b2 is false 
} 

bool Bar(object o) 
{ 
    return o == null; 
} 
1

1)創建一個具有一個參數和一個返回值的Func實例。 2)具有兩個參數和一個結果的Func實例。接收bool和int,返回字符串。 3)Func實例沒有參數和一個結果值。 4)在匿名函數上調用Invoke實例方法。

using System; 類節目{靜態無效的主要(){

Func<int, string> func1 = (x) => string.Format("string = {0}", x); 
Func<bool, int, string> func2 = (b, x) => 
    string.Format("string = {0} and {1}", b, x); 

Func<double> func3 =() => Math.PI/2; 

Console.WriteLine(func1.Invoke(10)); 
Console.WriteLine(func2.Invoke(true, 20)); 
Console.WriteLine(func3.Invoke()); } } 
相關問題