+C#+デリゲート(delegate) のバックアップ(No.2) - PukiWiki

+C#+言語セクション?

匿名メソッド
[edit]

匿名メソッドは、基本的にコード ブロックをデリゲート パラメータとして渡すために作成します。

書き方1:

button1.Click += delegate(System.Object o, System.EventArgs e)
                  { System.Windows.Forms.MessageBox.Show("Click!"); };

書き方2:

delegate void Del(int x);
Del d = delegate(int k) { /* 処理 */ };
このページのトップへ

デリゲートを宣言し、インスタンス化して使用する
[edit]

//デリゲートの宣言
public delegate void Del<T>(T item);
public void Notify(string str) { }
Del<string> name = Notify;
このページのトップへ

デリゲートの結合
[edit]

 デリゲート オブジェクトには、+ 演算子を使用して二つデリゲートを結合できます。結合されたデリゲートは、結合元の 2 つのデリゲートを呼び出します。結合できるのは同じ型のデリゲートだけです。- 演算子を使用すると、結合されたデリゲートからコンポーネントのデリゲートを削除できます。
MSDNにいいサンプルがあります:
http://msdn.microsoft.com/ja-jp/library/ms173175(v=VS.80).aspx

このページのトップへ

ラムダ式(Lambda)
[edit]

このページのトップへ

概要
[edit]

 ラムダ式は式とステートメントを含めることができる匿名関数であり、デリゲート型または式ツリー型を作成するために使用できます。

 ラムダ式はラムダ演算子 => が使用され、この演算子を「~に入力」と理解します。 ラムダ演算子の左辺で入力パラメーターを指定し (ある場合)、右辺には式ブロックまたはステートメント ブロックが入ります。 => 演算子と代入 (=) は優先順位が同じで、結合規則が右から左です。~

このページのトップへ

書き方
[edit]

 ラムダ式 x => x * x は、「x を x * x に入力」と読みます。この式は、次のようにデリゲート型に割り当てることができます。~

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

ツリー型を作成するには

Expression<del> myET = x => x * x;
このページのトップへ

式形式のラムダ
[edit]

右辺に式があるラムダ式を式形式のラムダと呼びます。 式形式のラムダは、式ツリー (C# および Visual Basic)の構築に幅広く使用されます。~

(input parameters) => expression
(x, y) => x == y
 (int x, string s) => s.Length > x
() => SomeMethod()
このページのトップへ

ステートメント形式のラムダ
[edit]

(input parameters) => {statement;}
delegate void TestDelegate(string s);
…
TestDelegate myDel = n => { string s = n + " " + "World"; Console.WriteLine(s); };
myDel("Hello");

匿名メソッドと同様、ステートメント形式のラムダを使用して式ツリーを作成することはできません。

このページのトップへ

標準クエリ演算子でのラムダ
[edit]

 標準クエリ演算子の多くが、汎用デリゲートの Func<T, TResult> ファミリに属する型の入力パラメーターを持ちます。 Func<T, TResult> デリゲートは型パラメーターを使用して入力パラメーターの数と型、およびデリゲートの戻り値の型を定義します。 Func デリゲートは、ソース データのセット内の各要素に適用されるユーザー定義の式をカプセル化する場合に非常に便利です。 たとえば、次のデリゲート型を

public delegate TResult Func<TArg0, TResult>(TArg0 arg0)

 このデリゲートを Func<int,bool> myFunc としてインスタンス化できます。int は入力パラメーター、bool は戻り値です。 戻り値は必ず最後の型パラメーターで指定されます。 Func<int, string, bool> は 2 つの入力パラメーター (int と string) と戻り値の型 bool を持つデリゲートを定義しています。 次の Func デリゲートを呼び出すと、入力パラメーターが 5 に等しいかどうかを示す true または false が返されます。

Func<int, bool> myFunc = x => x == 5;
bool result = myFunc(4); // returns false

 たとえば System.Linq.Queryable で定義された標準クエリ演算子において、引数型が Expression<Func> の場合もラムダ式を使用できます。 Expression<Func> 引数を指定すると、ラムダは式ツリーにコンパイルされます。

標準クエリ演算子である Count メソッドを次に示します。

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int oddNumbers = numbers.Count(n => n % 2 == 1);

 入力パラメーターの型はコンパイラが推論できますが、明示的に指定することもできます。 この特定のラムダ式は、2 で除算したときに剰余が 1 になる整数 (n) をカウントします。

 次のメソッドは、配列 numbers 内の "9" の左側にある要素をすべて含むシーケンスを作成します。これは、"9" がシーケンス内で条件を満たさない最初の数値だからです。

var firstNumbersLessThan6 = numbers.TakeWhile(n => n < 6);

 次の例は、複数の入力パラメーターを括弧で囲んで指定する方法を示しています。 このメソッドは、値がその位置よりも小さい数値が出現するまで配列 numbers に含まれるすべての要素を返します。

var firstSmallNumbers = numbers.TakeWhile((n, index) => n >= index);



0


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

e[NȂECir Yahoo yV LINEf[^[Ōz500~`I
z[y[W ̃NWbgJ[h COiq@COsیI COze