📢 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> | ||
< | <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); | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
次に、クラスメソッドを参照するデリゲートのインスタンスを作成する。<br> | 次に、クラスメソッドを参照するデリゲートのインスタンスを作成する。<br> | ||
< | <syntaxhighlight lang="csharp"> | ||
// インスタンスを作成するデリゲート型 | // インスタンスを作成するデリゲート型 | ||
// int型を引数にとり、int型を返すメソッドを参照するデリゲート型 | // int型を引数にとり、int型を返すメソッドを参照するデリゲート型 | ||
public delegate int IntToInt(int value); | public delegate int IntToInt(int value); | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
< | <syntaxhighlight lang="csharp"> | ||
// 参照するクラスとメソッド | // 参照するクラスとメソッド | ||
public class Calculator | public class Calculator | ||
| 53行目: | 53行目: | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
< | <syntaxhighlight lang="csharp"> | ||
// デリゲートのインスタンスを作成 | // デリゲートのインスタンスを作成 | ||
// AddOneメソッドを参照するIntToInt型 | // AddOneメソッドを参照するIntToInt型 | ||
| 62行目: | 62行目: | ||
// Calculatorクラス内ならば、以下の記述でもよい | // Calculatorクラス内ならば、以下の記述でもよい | ||
// IntToInt addOne = AddOne; | // IntToInt addOne = AddOne; | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
最後に、インスタンスメソッドを参照するデリゲートのインスタンスを作成する。<br> | 最後に、インスタンスメソッドを参照するデリゲートのインスタンスを作成する。<br> | ||
| 69行目: | 69行目: | ||
デリゲートは、対象のインスタンスへの参照も内部的に保持しており、<br> | デリゲートは、対象のインスタンスへの参照も内部的に保持しており、<br> | ||
そのインスタンスにアクセスするためのプロパティとして、<code>Delegate</code>型は<code>Target</code>プロパティを持っている。<br> | そのインスタンスにアクセスするためのプロパティとして、<code>Delegate</code>型は<code>Target</code>プロパティを持っている。<br> | ||
< | <syntaxhighlight lang="csharp"> | ||
// インスタンスを作成するデリゲート型 | // インスタンスを作成するデリゲート型 | ||
// int型を引数にとり、int型を返すメソッドを参照するデリゲート型 | // int型を引数にとり、int型を返すメソッドを参照するデリゲート型 | ||
public delegate int IntToInt(int value); | public delegate int IntToInt(int value); | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
< | <syntaxhighlight lang="csharp"> | ||
public class Multiplier | public class Multiplier | ||
{ | { | ||
| 90行目: | 90行目: | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
MultiplierクラスのインスタンスのCalcメソッドを参照するデリゲートのインスタンスを作成するには、以下のように記述する。<br> | MultiplierクラスのインスタンスのCalcメソッドを参照するデリゲートのインスタンスを作成するには、以下のように記述する。<br> | ||
< | <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を参照するデリゲートを生成 | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
== | == デリゲート - 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> | ||
< | <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; | ||
} | } | ||
</ | </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> | ||
< | <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; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
以下の例では、上記のCountListメソッドを使用して、List<string>型namesの要素のうち、文字列の長さが5未満のものを数えている。<br> | 以下の例では、上記のCountListメソッドを使用して、List<string>型namesの要素のうち、文字列の長さが5未満のものを数えている。<br> | ||
| 186行目: | 186行目: | ||
匿名関数を使用しない場合、デリゲートを作成するためだけに使用するメソッドの定義は、<br> | 匿名関数を使用しない場合、デリゲートを作成するためだけに使用するメソッドの定義は、<br> | ||
デリゲートのインスタンスを生成する場所と離れた位置に記述する必要があるため、可読性が悪い。<br> | デリゲートのインスタンスを生成する場所と離れた位置に記述する必要があるため、可読性が悪い。<br> | ||
< | <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); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
匿名関数とは、デリゲートのインスタンスを生成すると同時に、インラインでメソッドを定義するためのものである。<br> | 匿名関数とは、デリゲートのインスタンスを生成すると同時に、インラインでメソッドを定義するためのものである。<br> | ||
以下の例では、上記のIsLengthLessThan5メソッドを匿名関数に変更している。<br> | 以下の例では、上記のIsLengthLessThan5メソッドを匿名関数に変更している。<br> | ||
< | <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); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
上記の例は、匿名関数の一例である。<br> | 上記の例は、匿名関数の一例である。<br> | ||