📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == * デリゲートとは、メソッドを参照する型である。 * LINQ等で使用される<code>Action<T></code>や<code>Func<T, TResult></code>は、…」
 
編集の要約なし
155行目: 155行目:
このデリゲート型は、ListクラスのFindAllメソッドの引数として使用されており、ListクラスのConvertAllメソッド等でも使用されている。<br>
このデリゲート型は、ListクラスのFindAllメソッドの引数として使用されており、ListクラスのConvertAllメソッド等でも使用されている。<br>
他のデリゲート型には、<code>Convertor<TInput, TOutput></code>型、ListクラスのSortメソッドで使用されている<code>Comparison<T></code>型等がある。<br>
他のデリゲート型には、<code>Convertor<TInput, TOutput></code>型、ListクラスのSortメソッドで使用されている<code>Comparison<T></code>型等がある。<br>
<br><br>
== 匿名関数 ==
上記に記載した通り、デリゲートはメソッドを参照する型であり、LINQ等で使用するFunc<T, TResult>型等はデリゲートの型の1つである。<br>
<br>
匿名関数を説明するため、以下の例では、List<T>型とFunc<T, TResult>を引数とするCountListメソッドを記述している。<br>
第1引数であるList<T>型の変数の要素のうち、第2引数Func<T, bool>型のデリゲートを適用して、真になる要素の数を数えるメソッドである。<br>
<br>
7行目の<code>predicate(element)</code>では、T型のelementを引数に、Func<T, bool>型のデリゲートであるpredicateが参照しているメソッドを呼び出している。<br>
(<code>predicate(element)</code>は、<code>predicate.Invoke(element)</code>とも記述できる)<br>
<source lang="csharp">
public static int CountList<T>(List<T> list, Func<T, bool> predicate)
{
    int count = 0;
    foreach (T element in list)
    {
      // predicateが参照するメソッドを、elementを引数に渡して呼び出す
      if(predicate(element))
      {
          count++;  // 真ならカウンタをインクリメント
      }
    }
    return count;
}
</source>
<br>
以下の例では、上記のCountListメソッドを使用して、List<string>型namesの要素のうち、文字列の長さが5未満のものを数えている。<br>
<br>
匿名関数を使用しない場合、デリゲートを作成するためだけに使用するメソッドの定義は、<br>
デリゲートのインスタンスを生成する場所と離れた位置に記述する必要があるため、可読性が悪い。<br>
<source lang="csharp">
public static bool IsLengthLessThan5(string str)
{
    return str.Length < 5;
}
public static void Main(String[] args)
{
    var names = new List<string>
    {
      "Taro",
      "Jiro",
      "Saburo"
    };
    // IsLengthLessThan5を参照するFunc<string, bool>型のデリゲートを生成
    Func<string, bool> predicate = IsLengthLessThan5;
    int count = CountList(names, predicate);
}
</source>
<br>
匿名関数とは、デリゲートのインスタンスを生成すると同時に、インラインでメソッドを定義するためのものである。<br>
以下の例では、上記のIsLengthLessThan5メソッドを匿名関数に変更している。<br>
<source lang="csharp">
public static void Main (String[] args)
{
    List<string> names = new List<string>
    {
        "Taro",
        "Jiro",
        "Saburo"
    };
    // 匿名関数を参照するFunc<string, bool>型のデリゲートを作成
    // 匿名関数は、デリゲートの生成とメソッドの定義が近い位置にある
    Func<string, bool> predicate = delegate (string str)
    {
      return str.Length < 5;
    };
    int count = CountList(names, predicate);
}
</source>
<br>
上記の例は、匿名関数の一例である。<br>
匿名関数を使用することにより、インラインで処理を記述してデリゲートを生成することができ、可読性が上がる。<br>
<br>
しかし、C# 3.0以降では匿名関数を使用せずに、ラムダ式を使用すべきである。<br>
ラムダ式については、[[C Sharpの基礎 - ラムダ式|こちらのページ]]を参照すること。<br>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C_Sharp]]
[[カテゴリ:C_Sharp]]