-1

C# キーワード Using は、アンマネージ リソースを解放するメカニズムを提供する Idisposable を実装します。

今、私はこのコードを実行していました

string txt = String.Empty;
      using (StreamReader sr = new StreamReader(filename)) {
         txt = sr.ReadToEnd();
      }

なぜこのコードでキーワードUsingが使用されているのに、 StreamReaderはマネージ リソースであり、ガベージ コレクターはそのスコープを超えた後にオブジェクト メモリを解放する責任があるのでしょうか。

だから私の質問は、

  1. 上記のコードは、単にリソースを解放するための明示的な処理方法ですか?
  2. 私の理解によると、.net フレームワークで使用するメソッドまたはクラスはマネージド コードであり、StreamReader もマネージド コードに分類されません。
  3. Managed\Unmanaged コードに何か不足していますか?
4

2 に答える 2

1

StreamReader がマネージド リソースであるのに、このコードでキーワード Using が使用されているのはなぜですか

StreamReader はマネージド オブジェクトですが、マネージド ヒープに割り当てられていないオブジェクトを内部に保持する場合があります。ガベージ コレクターはそれらの割り当てを認識できないため、それらをクリーンアップできません。特定のケースでは、WIN32 ファイルハンドルを内部的に作成して保持する (特定のケースの) を内部的に作成しますStreamReaderFileStream

_handle = Win32Native.SafeCreateFile(tempPath, fAccess, share, secAttrs, mode, flagsAndAttributes, IntPtr.Zero);

(コード参照)

usingは、次の省略形です。

try
{
   var streamReader = new StreamReader(path);
   // code
} 
finally
{
  streamReader.Dispose();
}

実装するメソッドは、ファイル ハンドル、ソケット、または手動でのクリーニングが必要なリソースを閉じる機会を得る場所をIDisposable実装する必要があります。Dispose

をクラス内に保持することを選択した場合、 を に正しく渡すために、StreamReaderそのクラスも実装する必要があります。IDisposableDisposeStreamReader

したがって、ネイティブ オブジェクトを保持するクラス、または IDisposable を実装するオブジェクトを保持するクラスIDisposableのコントラクトと見なすことができます。

于 2016-12-05T17:06:54.770 に答える