2009-08-21 13 views
15

delegate System.Funcの使用方法<>?ファンクションやそれを使用するイベントの実行順序を制御する必要がありますか?C# - delegate System.Func < >

簡単な例では

答えて

23

あなたはこのような機能を持っていると仮定します。

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

第二は、戻り値の型であること、最初は、最初のパラメータの型であること、一般的な2つの引数を取りSystem.Funcのバージョンがあります。そのように、あなたが書くことができる:System.Funcのすべてのバージョンで

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

を、最後のジェネリック引数は戻り値の型で、他のすべてのために、パラメータの種類があります。

System.Funcは、カスタムデリゲート型を記述する必要がないため、便利です。これにより、同じシグネチャを持つデリゲートの相互運用がはるかに簡単になります。

は私が持っていたと言う:

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

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

タイプMyDelegate2のオブジェクトに私のMyDelegate1デリゲートをCONVERする方法は、彼らが同じメソッドシグネチャを持っているにもかかわらず、今はありません。一方、我々は代わりにカスタムデリゲート型を宣言するのFuncを使用していたならば、我々はこの問題

5

System.Func<T>は通常、別の関数の引数として使用されている参考になります。それはTの値を返す任意のデリゲートにすることができます - 複数の引数を持つデリゲートとして使用するための複数のバージョンがあります。

一般的な使用方法の1つはフィルタリングです。たとえば、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); 

ただし、上記の場合には、あなたが通り、その場でFunc<string,bool>を構築する可能性が高い利用ラムダ式をしたい:

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

技術的には、.Where()は述語デリゲートを要求します。しかし、それはFuncの特別なケースなので大丈夫です。 –

+4

ジョエル:そうではありません。 Enumerable.Where(Of(TSource))(IEnumerable(Of(TSource))、Func(Of(TSource、Boolean)))参照:http://msdn.microsoft.com/en-us/library/system.linq enumerable.where.aspx –

+0

具体的にはFuncとして定義されています

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; 
} 
0

戻り値を持つ任意のデリゲート型を表すためにそれを使用していません。

1

1)1つのパラメータと1つの戻り値を持つFuncインスタンスを作成します。 2)2つのパラメータと1つの結果を持つFuncインスタンス。 boolとintを受け取り、文字列を返します。 3)パラメータと結果値が1つもないFuncインスタンス。 4)匿名関数のInvokeインスタンスメソッドを呼び出します。

using System; classプログラム{static void Main(){

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