質問

アプリケーションにしたい場合はず清掃非営資源を利用できまを"使う"がキーワードとなります。が複数の従属物、この両端の巣をさら:

using (FileStream fs = new FileStream("c:\file.txt", FileMode.Open))
{
    using (BufferedStream bs = new BufferedStream(fs))
    {
        using (StreamReader sr = new StreamReader(bs))
        {
            // use sr, and have everything cleaned up when done.
        }
    }
}

C++では、私用で使うことができdestructorsいようになります:

{    
    FileStream fs("c:\file.txt", FileMode.Open);
    BufferedStream bs(fs);
    StreamReader sr(bs);
    // use sr, and have everything cleaned up when done.
}

あり、C#のい。やんこだわった、複数のレベルのネスト?

役に立ちましたか?

解決

い巣複数のusings:

using (FileStream fs = new FileStream("c:\file.txt", FileMode.Open))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
    // all three get disposed when you're done
}

他のヒント

きを計算書前のブレースのように:

  using (StreamWriter w1 = File.CreateText("W1"))
  using (StreamWriter w2 = File.CreateText("W2"))
  {
      // code here
  }

http://blogs.msdn.com/ericgu/archive/2004/08/05/209267.aspx

まあこの構文を凝縮いたり、いろいろト:

using (FileStream fs = new FileStream("c:\file.txt", FileMode.Open))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
}

このうちのひとつであがないを使用{}のためのすべてのブロックの意味をなぁ.

の代わりに営巣諸表を使用したりすることも可能ですの書き出します。廃棄手動で通話がんを見逃一つである。

運FxCopいことを確保することができすべてのIDisposable-実行型のインスタンスにて。Dispose()を呼び出し、または、営巣.

私のようにソリューションを実施 マイケル-メドウズ's"が、彼の StreamWrapper コードな考慮した場合の Dispose() 法と呼ばれるアプリケーションはメンバ変数を例外がスローされた理由は、その後の Dispose()esないという人がぶら下げる.により安全な方法をお持ちのお方のために仕事には:

        var exceptions = new List<Exception>();

        try
        {
            this.sr.Dispose();
        }
        catch (Exception ex)
        {
            exceptions.Add(ex);
        }

        try
        {
            this.bs.Dispose();
        }
        catch (Exception ex)
        {
            exceptions.Add(ex);
        }

        try
        {
            this.fs.Dispose();
        }
        catch (Exception ex)
        {
            exceptions.Add(ex);
        }

        if (exceptions.Count > 0)
        {
            throw new AggregateException(exceptions);
        }
    }

を省略することができる巻きブレースのように:

using (FileStream fs = new FileStream("c:\file.txt", FileMode.Open))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
        // use sr, and have everything cleaned up when done.
}

または利用の試みたアプローチ:

FileStream fs = new FileStream("c:\file.txt", FileMode.Open);
BufferedStream bs = new BufferedStream(fs);
StreamReader sr = new StreamReader(bs);
try
{
        // use sr, and have everything cleaned up when done.
}finally{
   sr.Close(); // should be enough since you hand control to the reader
}

これによって、大きなプラスの純にコードが有益で読みやすさ

using (StreamWrapper wrapper = new StreamWrapper("c:\file.txt", FileMode.Open))
{
    // do stuff using wrapper.Reader
}

がStreamWrapperは:

private class StreamWrapper : IDisposable
{
    private readonly FileStream fs;
    private readonly BufferedStream bs;
    private readonly StreamReader sr;

    public StreamWrapper(string fileName, FileMode mode)
    {
        fs = new FileStream(fileName, mode);
        bs = new BufferedStream(fs);
        sr = new StreamReader(bs);
    }

    public StreamReader Reader
    {
        get { return sr; }
    }

    public void Dispose()
    {
        sr.Dispose();
        bs.Dispose();
        fs.Dispose();
    }
}

一部の努力StreamWrapperきを整理する汎用及び再利用が可能です。

なお、一般的にストリームの作成については他のストリームの新しいストリームが閉まりに渡されます。なので、一層の削減の例:

using (Stream Reader sr = new StreamReader( new BufferedStream( new FileStream("c:\file.txt", FileMode.Open))))
{
    // all three get disposed when you're done
}

この例でみましょうとい:

という名前のファイル1.xml 下c:\

るテキストボックス名textBox1、マルチライン特性を設定します。

const string fname = @"c:\1.xml";

StreamReader sr=new StreamReader(new BufferedStream(new FileStream(fname,FileMode.Open,FileAccess.Read,FileShare.Delete)));
textBox1.Text = sr.ReadToEnd();

使用中の文の統語糖に変換するには:

   try
   {
      obj declaration
      ...
   }
   finally
   {
      obj.Dispose();
   }

できる明示的に呼び出処理自体もって安全で、かってない例外がスロー、資源な解放されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top