いいえ、アンマネージ リソースを使用せずに C# プログラムを作成することは不可能です。C# プログラムは、100% 管理されていないオペレーティング システムで実行されることは避けられません。ファイルを使用する場合は、オペレーティング システム リソースを使用します。ネットワーク接続。スレッド。コンソール。など、すべて非常に管理されていないリソースです。
しかし、その事実は .NET ではかなりうまく隠されています。フレームワーク ライブラリには、これらのネイティブ オブジェクト用の優れたラッパー クラスがあります。FileStream、ソケット、スレッド、コンソールなど。メモリもオペレーティング システムのリソースであり、ガベージ コレクタはその周りのラッパーです。
これらすべてのリソースのうち、メモリ リソースだけが真に自動的に管理されます。それらの残りの部分は、ラッパー クラスのおかげである程度の助けになります。それらのファイナライザーが鍵であり、呼び出されたときにオペレーティング システムのリソースを解放します。これはほぼ自動です。ガベージ コレクターは、ラッパー クラス オブジェクトがどこにも参照されていないことに気づき、それを解放します。その後、ファイナライザーは、アンマネージ リソースも解放されるようにします。
これは通常はうまく機能しますが、多くの場合、コード内でこれらの実装の詳細を無視できます。多くのプログラマーがそうしています。
ただし、ファイナライザーには問題があり、実行を開始するのに時間がかかります。それらを開始するにはガベージ コレクションが必要で、数ミリ秒から数分かかる場合があります。これは予測不可能であり、コードでメモリを消費する速度に依存します。たくさん使わないと、かなり時間がかかります。
管理されていないリソースが解放されるまで、それほど長く待つ余裕があるとは限りません。ファイルが良い例です。ファイルからデータを読み取るためにファイルを開いた場合、読み取りが完了したらファイルを閉じる必要があります。ファイナライザーがそのジョブを完了するまで待つと、しばらくしてからファイルを再度開く必要があるときに、プログラムが失敗するリスクがあります。FileShare.None でファイルを開くと、自分自身のコードもロックアウトされます。大したことではありません。読み取りが完了したら、Close() を呼び出してファイルを閉じます。確実に閉じられるようにするには、Close() 呼び出しを finally ブロックに配置して、コードが例外によって中止された場合でも実行されるようにする必要があります。実際には、ファイナライザー コードを明示的に実行します。
より深刻なケースは、非常に高価なオペレーティング システム リソースです。それらの良い例はビットマップで、大量のアンマネージ メモリやデータベース接続を使用する可能性があります。デフォルトでは 100 個しか含まれないプールがあります。これらの場合、ファイナライザーにリソースの解放を任せても、時間がかかりすぎてうまくいかない状況に陥る可能性があります。ファイナライザーが実行される前に、プログラムが例外で終了します。プログラムに負荷がかかっているときにのみ発生する傾向があるため、通常、診断はかなり困難です。デスクトップ上にないマシンで多くのことが起こっているときに発生する問題をデバッグするのは常に困難です。
.NET の設計者はこの必要性を認識し、IDisposable インターフェイスを設計しました。その Dispose() メソッドは、ファイナライザーによって通常実行されるコードを実行するように設計されており、ガベージ コレクターがリソースに到達するのを待つのではなく、明示的にリソースを解放する方法を提供します。そして、言語設計者は、IDisposable.Dispose() が自動的に呼び出されるように、 usingキーワードを言語に追加することで、その流行に飛び乗りました。
上記で説明したように、IDisposable を実装する任意のオブジェクトのコードで using または Dispose() を使用することはオプションですが、多くの .NET プログラマーによって重要であると考えられています。ほとんどの場合、誰もがそれなしで .NET プログラミングを開始し、プログラムが大きくなると遅かれ早かれ問題に遭遇したためです。MemoryStream のように、Dispose() の呼び出しが意味をなさないクラスにも規定されています。また、Thread のように、クラスが IDisposable を実装する必要があるのに実装しない場合、精神的苦痛を引き起こします。または、クラスが Dispose と Close の両方を実装する場合 (違いはありません)。比較のために、Java にも同じ考慮事項がありますが、IDisposable はありません。