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

編集の要約なし
文字列「</source>」を「</syntaxhighlight>」に置換
 
(同じ利用者による、間の5版が非表示)
10行目: 10行目:
<br><br>
<br><br>


== デリゲート ==
== デリゲート - Delegate型 ==
C#におけるデリゲートとは、メソッドを参照する型のことである。<br>
C#におけるデリゲートとは、メソッドを参照する型のことである。<br>
<br>
<br>
20行目: 20行目:
デリゲート型を作成するには、以下のように<code>delegate</code>キーワードを使用する。<br>
デリゲート型を作成するには、以下のように<code>delegate</code>キーワードを使用する。<br>
これにより、Delegate型(正確には、MulticastDelegate型)のサブクラスが定義される。<br>
これにより、Delegate型(正確には、MulticastDelegate型)のサブクラスが定義される。<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  // int型を引数にとり、int型を返すメソッドを参照するデリゲート型
  // int型を引数にとり、int型を返すメソッドを参照するデリゲート型
  public delegate int IntToInt(int value);
  public delegate int IntToInt(int value);
35行目: 35行目:
  // 2つのint型を引数にとり、int型を返すメソッドを参照するデリゲート型
  // 2つのint型を引数にとり、int型を返すメソッドを参照するデリゲート型
  public delegate int IntIntToInt(int value0, int value1);
  public delegate int IntIntToInt(int value0, int value1);
  </source>
  </syntaxhighlight>
<br>
<br>
次に、クラスメソッドを参照するデリゲートのインスタンスを作成する。<br>
次に、クラスメソッドを参照するデリゲートのインスタンスを作成する。<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  // インスタンスを作成するデリゲート型
  // インスタンスを作成するデリゲート型
  // int型を引数にとり、int型を返すメソッドを参照するデリゲート型
  // int型を引数にとり、int型を返すメソッドを参照するデリゲート型
  public delegate int IntToInt(int value);
  public delegate int IntToInt(int value);
  </source>
  </syntaxhighlight>
<br>
<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  // 参照するクラスとメソッド
  // 参照するクラスとメソッド
  public class Calculator
  public class Calculator
53行目: 53行目:
     }
     }
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  // デリゲートのインスタンスを作成
  // デリゲートのインスタンスを作成
  // AddOneメソッドを参照するIntToInt型
  // AddOneメソッドを参照するIntToInt型
62行目: 62行目:
  // Calculatorクラス内ならば、以下の記述でもよい
  // Calculatorクラス内ならば、以下の記述でもよい
  // IntToInt addOne = AddOne;
  // IntToInt addOne = AddOne;
  </source>
  </syntaxhighlight>
<br>
<br>
最後に、インスタンスメソッドを参照するデリゲートのインスタンスを作成する。<br>
最後に、インスタンスメソッドを参照するデリゲートのインスタンスを作成する。<br>
69行目: 69行目:
デリゲートは、対象のインスタンスへの参照も内部的に保持しており、<br>
デリゲートは、対象のインスタンスへの参照も内部的に保持しており、<br>
そのインスタンスにアクセスするためのプロパティとして、<code>Delegate</code>型は<code>Target</code>プロパティを持っている。<br>
そのインスタンスにアクセスするためのプロパティとして、<code>Delegate</code>型は<code>Target</code>プロパティを持っている。<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  // インスタンスを作成するデリゲート型
  // インスタンスを作成するデリゲート型
  // int型を引数にとり、int型を返すメソッドを参照するデリゲート型
  // int型を引数にとり、int型を返すメソッドを参照するデリゲート型
  public delegate int IntToInt(int value);
  public delegate int IntToInt(int value);
  </source>
  </syntaxhighlight>
<br>
<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  public class Multiplier
  public class Multiplier
  {
  {
90行目: 90行目:
     }
     }
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
MultiplierクラスのインスタンスのCalcメソッドを参照するデリゲートのインスタンスを作成するには、以下のように記述する。<br>
MultiplierクラスのインスタンスのCalcメソッドを参照するデリゲートのインスタンスを作成するには、以下のように記述する。<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  Multiplier doubler = new Multiplier(2);    // Calcメソッドは、引数で渡した数の2倍の数を返す
  Multiplier doubler = new Multiplier(2);    // Calcメソッドは、引数で渡した数の2倍の数を返す
  IntToInt doublerIntToInt = doubler.Calc;  // doublerのCalcを参照するデリゲートを生成
  IntToInt doublerIntToInt = doubler.Calc;  // doublerのCalcを参照するデリゲートを生成
99行目: 99行目:
  Multiplier trippler = new Multiplier(3);  // Calcメソッドは引数で渡した数の3倍の数を返す
  Multiplier trippler = new Multiplier(3);  // Calcメソッドは引数で渡した数の3倍の数を返す
  IntToInt tripplerIntToInt = trippler.Calc; // tripplerのCalcを参照するデリゲートを生成
  IntToInt tripplerIntToInt = trippler.Calc; // tripplerのCalcを参照するデリゲートを生成
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== ActionとFunc ==
== デリゲート - Action型とFunc型 ==
Action<T>は、T型の引数をとり、戻り値は返さないメソッドを参照するジェネリックなデリゲート型である。<br>
Action<T>は、T型の引数をとり、戻り値は返さないメソッドを参照するジェネリックなデリゲート型である。<br>
Func<T, TResult>は、T型の引数をとり、TResult型を返すメソッドを参照するジェネリックなデリゲート型である。<br>
Func<T, TResult>は、T型の引数をとり、TResult型を返すメソッドを参照するジェネリックなデリゲート型である。<br>
108行目: 108行目:
<br>
<br>
以下の例では、Func<T, TResult>型のデリゲートのインスタンスを生成している。<br>
以下の例では、Func<T, TResult>型のデリゲートのインスタンスを生成している。<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  public static int AddOne(int value)
  public static int AddOne(int value)
  {
  {
130行目: 130行目:
     Func<double, double> doubleFloatDelegate = Math.Abs;
     Func<double, double> doubleFloatDelegate = Math.Abs;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
Func<T, TResult>はジェネリックなデリゲート型なので、適切に型パラメータを設定すれば、様々なメソッドを参照できます。<br>
Func<T, TResult>はジェネリックなデリゲート型なので、適切に型パラメータを設定すれば、様々なメソッドを参照できます。<br>
165行目: 165行目:
7行目の<code>predicate(element)</code>では、T型のelementを引数に、Func<T, bool>型のデリゲートであるpredicateが参照しているメソッドを呼び出している。<br>
7行目の<code>predicate(element)</code>では、T型のelementを引数に、Func<T, bool>型のデリゲートであるpredicateが参照しているメソッドを呼び出している。<br>
(<code>predicate(element)</code>は、<code>predicate.Invoke(element)</code>とも記述できる)<br>
(<code>predicate(element)</code>は、<code>predicate.Invoke(element)</code>とも記述できる)<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  public static int CountList<T>(List<T> list, Func<T, bool> predicate)
  public static int CountList<T>(List<T> list, Func<T, bool> predicate)
  {
  {
180行目: 180行目:
     return count;
     return count;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
以下の例では、上記のCountListメソッドを使用して、List<string>型namesの要素のうち、文字列の長さが5未満のものを数えている。<br>
以下の例では、上記のCountListメソッドを使用して、List<string>型namesの要素のうち、文字列の長さが5未満のものを数えている。<br>
186行目: 186行目:
匿名関数を使用しない場合、デリゲートを作成するためだけに使用するメソッドの定義は、<br>
匿名関数を使用しない場合、デリゲートを作成するためだけに使用するメソッドの定義は、<br>
デリゲートのインスタンスを生成する場所と離れた位置に記述する必要があるため、可読性が悪い。<br>
デリゲートのインスタンスを生成する場所と離れた位置に記述する必要があるため、可読性が悪い。<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  public static bool IsLengthLessThan5(string str)
  public static bool IsLengthLessThan5(string str)
  {
  {
206行目: 206行目:
     int count = CountList(names, predicate);
     int count = CountList(names, predicate);
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
匿名関数とは、デリゲートのインスタンスを生成すると同時に、インラインでメソッドを定義するためのものである。<br>
匿名関数とは、デリゲートのインスタンスを生成すると同時に、インラインでメソッドを定義するためのものである。<br>
以下の例では、上記のIsLengthLessThan5メソッドを匿名関数に変更している。<br>
以下の例では、上記のIsLengthLessThan5メソッドを匿名関数に変更している。<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  public static void Main (String[] args)
  public static void Main (String[] args)
  {
  {
229行目: 229行目:
     int count = CountList(names, predicate);
     int count = CountList(names, predicate);
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
上記の例は、匿名関数の一例である。<br>
上記の例は、匿名関数の一例である。<br>