【 C# 】拡張メソッドとは?使い方や便利な点を解説【サンプルコードあり】

拡張メソッドを活用してコードを簡潔に使用

拡張メソッドとは

拡張メソッドとは、既存の型やクラスに対して元の型の変更を行うことなくメソッドを追加することができる機能です。追加したメソッドも簡単に呼び出しが可能です。

using System.Linq;で定義して使う LINQ も拡張メソッドです。

拡張メソッドのルール

クラスを static にする

追加する拡張メソッドも static にする

拡張メソッドの第一引数は型自身を表す this 型 引数名 とする

拡張メソッドのメリット

拡張メソッドを活用すると、既存のクラスに新しいメソッドを追加できます。

これにより、既存のクラスの機能を拡張することができます

また拡張メソッドは簡潔な記述を提供するため、コードの読みやすさ向上に繋がります

拡張メソッドを作ってみる

例えば、数値の平方根を求める拡張メソッドを作成してみます。

新たに拡張メソッド用のクラスを作り、以下のコードを記載します。

public static class ExtensionMethods
{
    public static double SquareRoot(this int num)
    {
        return Math.Sqrt(num);
    }
}

上記の拡張メソッドは、int 型や double 型などの数値型に対して簡潔に平方根を求めることができます。

作成した拡張メソッドの呼び出し方法はこちらです。

int number = 4;
Console.WriteLine(number.SquareRoot());
// 出力 -> 2

拡張メソッドを活用することで既存のクラスの機能を拡張し、簡潔な記述を提供することができます。同じ処理をあちこちで書いてる場合も、拡張メソッドにまとめることでコードの重複を無くすことができます。

拡張メソッド参考例

参考として、他にもいくつか拡張メソッドを紹介します。

IntExtensions.cs

public static class IntExtensions
{
    // 偶数かどうか判定
    public static bool IsEven(this int value)
    {
        return value % 2 == 0;
    }

    // 奇数かどうか判定
    public static bool IsOdd(this int value)
    {
        return value % 2 != 0;
    }

    // 数値が引数の min 以上 max 以下であるか
    public static bool InBetween(this int value, int min, int max)
    {
        return value.CompareTo(min) >= 0 && value.CompareTo(max) <= 0;
    }
}

使用例

int num1 = 2;
num1.IsEven(); // True

int num2 = 20;
num2.IsOdd(); // False

int num3 = 5;
num3.InBetween(2, 10); // True

StringExtensions.cs

using System;
using System.Collections.Generic;

public static class StringExtensions
{
    private static char[] STRING_COMMA_SEPARATOR = { ',' };

    // 「,」で区切られた文字列を分割してリスト化する
    public static IList<string> SplitComma(this string listString)
    {
        return listString.Split(STRING_COMMA_SEPARATOR, StringSplitOptions.RemoveEmptyEntries);
    }

    // string を enum の要素に変換
    public static T ToEnum<T>(this string str)
    {
        Type enumType = typeof(T);
        return (T)Enum.Parse(enumType, str);
    }
}

CollectionExtensions.cs

using System;
using System.Collections;
using System.Collections.Generic;

public static class CollectionExtensions
{
    public static bool IsNullOrEmpty(this IList collection)
    {
        return collection == null || collection.Count == 0;
    }

    public static void AddRange<T, S>(this IList<T> list, params S[] values) where S : T
    {
        foreach (S value in values)
        {
            list.Add(value);
        }
    }

    // コレクションを条件付きで追加
    public static bool AddIf<T>(this IList<T> list, Predicate<T> predicate, T item)
    {
        if (predicate(item))
        {
            list.Add(item);
            return true;
        }

        return false;
    }

    // コレクションを条件付きで削除
    public static bool RemoveIf<T>(this IList<T> list, Predicate<T> predicate, T item)
    {
        if (predicate(item))
        {
            list.Remove(item);
            return true;
        }

        return false;
    }

    // コレクションにまだ追加されてなければ追加
    public static bool AddIfNotContains<T>(this IList<T> list, T item)
    {
        if (!list.Contains(item))
        {
            list.Add(item);
            return true;
        }

        return false;
    }
}

関連リンク

Linqメソッド簡易解説&使い方まとめ【C#】 LINQ の各メソッドの紹介と使い方まとめ(Select, Where など)