【C#】Disposeの使い方

【C#】Disposeの使い方

Disposeとは

C#のDisposeメソッドは、オブジェクトが使用しているリソース(ファイルハンドル、ネットワーク接続、データベース接続など)を明示的に解放するために使われます。ガベージコレクター(GC)はメモリを管理しますが、外部リソースの解放は保証されないため、明示的な解放が必要です。

IDisposableインターフェース

IDisposableインターフェースを実装すると、オブジェクトにDispose()メソッドを定義できます。これにより、明示的にリソースを解放できます。

using System;
using System.IO;

class MyResource : IDisposable
{
    private FileStream fileStream;

    public MyResource(string filePath)
    {
        fileStream = new FileStream(filePath, FileMode.OpenOrCreate);
    }

    public void Dispose()
    {
        fileStream?.Close();
        fileStream?.Dispose();
        Console.WriteLine("リソースが解放されました。");
    }
}

class Program
{
    static void Main()
    {
        MyResource resource = new MyResource("test.txt");
        resource.Dispose();
    }
}

Disposeパターン

複雑なリソース管理ではDisposeパターンを実装し、GC.SuppressFinalize(this)を使用してファイナライザの呼び出しを抑制します。

class MyClass : IDisposable
{
    private bool disposed = false;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // マネージドリソースの解放
            }
            // アンマネージドリソースの解放
            disposed = true;
        }
    }

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

usingステートメント

usingステートメントを使用すると、IDisposableオブジェクトを確実に破棄できます。

using (MyResource resource = new MyResource("test.txt"))
{
    // リソースを使用
} // ここで自動的にDispose()が呼ばれる

まとめ

  • IDisposableを実装してリソースを適切に解放する。
  • 明示的にDispose()を呼ぶか、usingステートメントを利用する。
  • Disposeパターンを実装すると、より安全にリソース管理できる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です