拡張メソッド
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 39/70。
拡張メソッドを使うと、既存の型のソースコードを変更したり派生クラスを作成したりせずに、新しいメソッドを追加できます。拡張メソッドはその型本来のメソッドであるかのように見えるため、コードがより読みやすく直感的になります。
拡張メソッドを作成するには、静的クラス内で静的メソッドを定義し、最初のパラメーターの前に this キーワードを付けます。
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(' ').Length;
}
}これで、任意の文字列に対してこのメソッドを直接呼び出せます。
string sentence = "Hello World Today";
int count = sentence.WordCount(); // 3this string str パラメーターは、このメソッドが string 型を拡張することをコンパイラーに伝えます。sentence.WordCount() を呼び出すと、コンパイラーは内部でそれを StringExtensions.WordCount(sentence) に変換します。
拡張メソッドは追加のparameterも受け取れます:
public static bool IsLongerThan(this string str, int length)
{
return str.Length > length;
}
// 使用例
bool result = "Hello".IsLongerThan(3); // trueこのテクニックはLINQで広く使用されており、Where()やSelect()のようなメソッドはIEnumerableに対するextension methodsです。extension methodsは、自分で制御できない型にユーティリティ関数を追加するのに便利で、コードを簡潔で表現力豊かに保てます。
チャレンジ
簡単整数に便利な機能を追加する、役立つ拡張メソッドのセットを作成しましょう。組み込みで用意されていると便利な機能を追加します。整数に対して直接呼び出せる拡張メソッドを含む静的クラスを作成し、コードをより表現豊かで読みやすくします。
コードを2つのファイルに分けて整理します。
IntExtensions.cs:Utilities名前空間にIntExtensionsという静的クラスを作成します。このクラスには、int型を拡張する拡張メソッドを含めます。IsEven()- 数値が偶数の場合はtrue、それ以外の場合はfalseを返しますSquare()- 数値をそれ自体に掛けた結果を返しますIsInRange(int min, int max)- 数値が min 以上 max 以下(両端を含む)の場合はtrue、それ以外の場合はfalseを返します
thisキーワードを使用する必要があることを覚えておいてください。Program.cs:メインファイルで入力から整数を読み取り、3つすべての拡張メソッドを実演します。組み込みメソッドであるかのように、各メソッドを整数に対して直接呼び出し、その結果を出力します。
3つの入力を受け取ります。
- テストする数値(整数)
- 範囲チェックの最小値(整数)
- 範囲チェックの最大値(整数)
次の形式で出力します。
Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}たとえば、入力が 7、5、10 の場合、出力は次のようになります。
Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? Truenumber.IsEven() や number.Square() と自然に記述できることに注目してください。拡張メソッドは、まるで最初から整数型の一部であったかのように感じられます。
自分で試してみよう
using System;
using Utilities;
class Program
{
public static void Main(string[] args)
{
// 入力を読み取る
int number = Convert.ToInt32(Console.ReadLine());
int min = Convert.ToInt32(Console.ReadLine());
int max = Convert.ToInt32(Console.ReadLine());
// TODO: 'number' の拡張メソッドを使用して結果を出力する
// number.IsEven()、number.Square()、および number.IsInRange(min, max) を呼び出す
// 次の形式で出力する:
// {number} は偶数ですか? {True/False}
// {number} の平方: {result}
// {number} は範囲 [{min}-{max}] 内ですか? {True/False}
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: C#オンラインコンパイラ