Func<>
は一般的なデリゲートです。引数と戻り値のタイプの組み合わせごとに独自のデリゲートを作成する必要がないため、非常に便利です。
以前は、次のようなものを書く必要がありました。
public delegate long MyDelegate( int number );
public void Method( IEnumerable<int> list, MyDelegate myDelegate )
{
foreach( var number in list )
{
myDelegate( number );
}
}
ユーザーがメソッドを正しく呼び出すことができるように、デリゲートを公開する必要がありました。特に、多数の異なるデリゲートが必要な場合は、引数リストとリターンタイプごとに1つずつ公開することになります。あなたと一緒に書くだけです
:Func<>
public void Method( IEnumerable<int> list, Func<int, long> myDelegate )
{
foreach( var number in list )
{
myDelegate( number );
}
}
これは、最初のコード例と同じ意味Func<int, long>
です-1つの整数引数を取り、長い値を返すデリゲートを定義します。
もちろん、より長いパラメータリストを使用することもできます。2つのintとbool値を使用している間も、長い値をFunc<int, int, bool, long>
返します。戻り値のないデリゲートが必要な場合は、を使用する必要があります。これは、戻りタイプとしてvoidを持ちます。Action<>
編集(リクエストによる):私の例のメソッドを呼び出す方法:
MyDelegate
呼び出し元の場合、またはを使用したソリューションに違いはありませんFunc<>
。どちらの場合も、メソッドを呼び出すための3つのオプションがあります。
ラムダ表記の使用(C#3.0が必要、おそらく短いメソッドに最適なソリューション):
Method( myList, i => i * i );
匿名メソッドを使用する(C#2.0が必要):
Method( myList, delegate( int i )
{
return i * i;
} );
または、引数として実際のメソッドを使用することによって:
Method( myList, Square );
private static long Square( int number )
{
return number * number;
}