【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パターンを実装すると、より安全にリソース管理できる。