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

文字列「source lang」を「syntaxhighlight lang」に置換
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);
38行目: 38行目:
<br>
<br>
次に、クラスメソッドを参照するデリゲートのインスタンスを作成する。<br>
次に、クラスメソッドを参照するデリゲートのインスタンスを作成する。<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  // インスタンスを作成するデリゲート型
  // インスタンスを作成するデリゲート型
  // int型を引数にとり、int型を返すメソッドを参照するデリゲート型
  // int型を引数にとり、int型を返すメソッドを参照するデリゲート型
44行目: 44行目:
  </source>
  </source>
<br>
<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  // 参照するクラスとメソッド
  // 参照するクラスとメソッド
  public class Calculator
  public class Calculator
55行目: 55行目:
  </source>
  </source>
<br>
<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  // デリゲートのインスタンスを作成
  // デリゲートのインスタンスを作成
  // AddOneメソッドを参照するIntToInt型
  // AddOneメソッドを参照するIntToInt型
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型を返すメソッドを参照するデリゲート型
75行目: 75行目:
  </source>
  </source>
<br>
<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  public class Multiplier
  public class Multiplier
  {
  {
93行目: 93行目:
<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を参照するデリゲートを生成
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)
  {
  {
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)
  {
  {
186行目: 186行目:
匿名関数を使用しない場合、デリゲートを作成するためだけに使用するメソッドの定義は、<br>
匿名関数を使用しない場合、デリゲートを作成するためだけに使用するメソッドの定義は、<br>
デリゲートのインスタンスを生成する場所と離れた位置に記述する必要があるため、可読性が悪い。<br>
デリゲートのインスタンスを生成する場所と離れた位置に記述する必要があるため、可読性が悪い。<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  public static bool IsLengthLessThan5(string str)
  public static bool IsLengthLessThan5(string str)
  {
  {
210行目: 210行目:
匿名関数とは、デリゲートのインスタンスを生成すると同時に、インラインでメソッドを定義するためのものである。<br>
匿名関数とは、デリゲートのインスタンスを生成すると同時に、インラインでメソッドを定義するためのものである。<br>
以下の例では、上記のIsLengthLessThan5メソッドを匿名関数に変更している。<br>
以下の例では、上記のIsLengthLessThan5メソッドを匿名関数に変更している。<br>
  <source lang="csharp">
  <syntaxhighlight lang="csharp">
  public static void Main (String[] args)
  public static void Main (String[] args)
  {
  {