システム定義インターフェイスを使用する方法を学ぶ

完了

C# アプリケーションへのシステム定義インターフェイスの統合は、多くの実用的なコーディング シナリオで役立ちます。 C# のシステム定義インターフェイスを使用すると、定義済みの機能を適用して、アプリケーションの一貫性と安定性を実現できます。

メソッドで使用される一般的なインターフェイス

.NET Framework 内の C# メソッドでは、いくつかの一般的なインターフェイスが頻繁に使用されます。 これらのインターフェイスは、さまざまなクラスによって実装される標準的な機能を提供します。

  • IComparable: オブジェクトの比較に使用されます。
  • IEnumerable: コレクションの反復処理に使用されます。
  • IDisposable: アンマネージ リソースを解放するために使用されます。
  • IEquatable: 等価比較を定義するために使用されます。

システム定義インターフェイスを実装する

システム定義インターフェイス メンバーを実装するには、実装するクラスの対応するメンバーがパブリックであり、 staticではなく、インターフェイス メンバーと同じ名前とシグネチャを持つ必要があります。 インターフェイスを実装するクラスまたは構造体では、インターフェイスで既定の実装が提供されていない、すべての宣言されたメンバーに対し、実装を提供する必要があります。

.NET のシステム定義インターフェイスでは、多くの場合、プレースホルダー T を使用して任意の型を表します。 たとえば、 IEquatable インターフェイスは.NET フレームワークで次のように定義されます。

public interface IEquatable
{
    bool Equals(T other);
}

このインターフェイスをクラスに実装する場合は、 T をクラスの型に置き換えます。

たとえば、次の Car クラスは、 IEquatable インターフェイスを実装します。

public class Car : IEquatable
{
    public string Make { get; set; }
    public string Model { get; set; }

    public bool Equals(Car other)
    {
        if (other == null) return false;
        return this.Make == other.Make && this.Model == other.Model;
    }
}

この例では、CarTIEquatableを置き換え、IEquatableします。 Car クラスは、現在のEquals オブジェクトのMakeプロパティとModelプロパティがCarother オブジェクトのプロパティと等しいかどうかをチェックする、Car メソッドの独自の実装を提供します。

クラスのプロパティとインデクサーは、インターフェイスで定義されているプロパティまたはインデクサーの追加アクセサーを定義できます。 たとえば、インターフェイスでは、 get アクセサーを持つプロパティを宣言できます。 インターフェイスを実装するクラスは、 get アクセサーと set アクセサーの両方で同じプロパティを宣言できます。 次に例を示します。

public interface IExampleInterface
{
    string Name { get; }
}

public class ExampleClass : IExampleInterface
{
    public string Name { get; set; }
}

この例では、IExampleInterfaceは、Name アクセサーを使用してプロパティ getを宣言します。 ExampleClass はインターフェイスを実装し、 get アクセサーと set アクセサーの両方で同じプロパティを宣言します。

共通システム定義インターフェイスの使用

.NET アプリケーションでは、 IEnumerableIDisposableIComparable などの一般的なシステム定義インターフェイスが頻繁に使用されます。 これらのインターフェイスは、さまざまな型間で一貫した動作を保証するために実装できる標準的なメソッドを提供します。

IEnumerable

IEnumerable インターフェイスは、列挙可能なコレクションを定義するために使用されます。 これには、コレクションを反復処理する列挙子を返す 1 つのメソッド ( GetEnumerator) が含まれています。

public class MyCollection : IEnumerable
{
    private int[] _items = { 1, 2, 3, 4, 5 };

    public IEnumerator GetEnumerator()
    {
        for (int i = 0; i < _items.Length; i++)
        {
            yield return _items[i];
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

IDisposable

IDisposable インターフェイスは、アンマネージ リソースを解放するために使用されます。 アンマネージド リソースは、ファイル ハンドル、ネットワーク接続など、.NET ランタイムで処理されないリソースです。メモリ リークやその他の問題を防ぐために、使用後にこれらのリソースを解放することが重要です。 これには、リソースを解放するために呼び出される 1 つのメソッド ( Dispose) が含まれています。

public class ResourceHolder : IDisposable
{
    private bool _disposed = false;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this); // Prevents the garbage collector from calling the finalizer if Dispose has already been called.
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                // Free managed resources
            }
            // Free unmanaged resources
            _disposed = true;
        }
    }

    ~ResourceHolder()
    {
        Dispose(false);
    }
}

イコムパラブル

IComparable インターフェイスは、クラスのインスタンスを比較するためのメソッドを定義するために使用されます。 これには、現在のインスタンスを同じ型の別のオブジェクトと比較する 1 つのメソッド ( CompareTo) が含まれています。

public class Person : IComparable
{
    public string Name { get; set; }
    public int Age { get; set; }

    public int CompareTo(Person other)
    {
        if (other == null) return 1; // If 'other' is null, this instance is considered greater
        return this.Age.CompareTo(other.Age); // Returns negative value if  precedes 'other', 0 if same position, or postive value if follows 'other'.
    }
}

この例では、 other が null の場合、現在のインスタンスが null 参照より大きいと見なされることを示す 1 が返されます。

C# のシステム定義インターフェイスは、効率的で安定した一貫性のあるアプリケーションを作成する上で重要な役割を果たします。 さまざまな種類に実装できる標準的なメソッドが用意されているため、動作の均一性と予測可能性が確保されます。 これらのインターフェイスを理解して効果的に実装することで、定義済みの機能を使用し、繰り返しコードの量を減らし、アプリケーションの保守性と堅牢性を高めることができます。