10

ファイル操作にクラスを使用しStreamWriterていますが、このコードに表示されていない問題はありますか?

try catch finallyブロックに入れる必要がありますか?

StreamWriter sr = new StreamWriter(streamFolder);
sr.Write(details);

File.SetAttributes(streamFolder, FileAttributes.Hidden);
sr.Close();
4

5 に答える 5

37

コードの何が問題になっていますか?ストリームを閉じる前に何らかの例外が発生した場合、ストリームは開いたままになり、システムリソースは解放されません。

StreamWriter sr = new StreamWriter(streamFolder);
sr.Write(details);
// some exception occurs here 
File.SetAttributes(streamFolder, FileAttributes.Hidden);
sr.Close();

したがって、そのストリームが閉じられることを確認する必要があります。try...finallyこれはブロックによって達成できます:

StreamWriter sr = new StreamWriter(streamFolder);

try 
{
   sr.Write(details);
   // some exception occurs here 
   File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
finally
{
   sr.Close();
}

ただし、StreamWriterはIDisposableインターフェイスを実装しているため、ライターの使用法をusingブロック にラップすることで、C#コンパイラに自動的に実行させることができます。

using(StreamWriter sr = new StreamWriter(streamFolder)) 
{
   sr.Write(details);
   // some exception occurs here 
   File.SetAttributes(streamFolder, FileAttributes.Hidden);
}

このコードは次のようにコンパイルされます。

StreamWriter sr = new StreamWriter(streamFolder);

try 
{
   sr.Write(details);
   // some exception occurs here 
   File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
finally
{
   if (sr != null)
      sr.Dispose();
}

手動実装の唯一の違いはnullチェックであり、Disposeの代わりにメソッドが呼び出されCloseます。ただし、実際に呼び出すClose()か、Dispose()同じコードが実行されると、次のようになります。

this.Dispose(true);
GC.SuppressFinalize(this);

Disposeメソッドの実装について詳しく読むことができます。

于 2012-07-13T09:12:48.717 に答える
7

おそらく using ステートメントを使用する必要があります。

using (StreamWriter sr = new StreamWriter(streamFolder))
{
    sr.Write(details);
    File.SetAttributes(streamFolder, FileAttributes.Hidden);
}

using ブロックの最後で、例外が発生したか、コードが正常に実行されたかにかかわらず、StreamWriter.Dispose が呼び出されます。

于 2012-07-13T09:00:38.170 に答える
5

使用したい:

  using (StreamWriter sr = new StreamWriter(streamFolder))
  {
      sr.Write(details); 

      File.SetAttributes(streamFolder, FileAttributes.Hidden); 
  }

は必要ありませんClose

于 2012-07-13T09:00:02.217 に答える
5

usingブロックで包む

using(StreamWriter sr = new StreamWriter(streamFolder))
{
      sr.Write(details);
      File.SetAttributes(streamFolder, FileAttributes.Hidden);
}

streamFolderネーミングが適切であることを確認してくださいfName。IO (またはその他の) 例外を処理できると思われる場合は、このコードを try-catch-finally に入れることもできます。

StreamWriter sr;
try
{
    sr = new StreamWriter(streamFolder);
    sr.Write(details);
    File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
catch(IOException ex)
{
    //handling IO
}
finally
{
    if (sr != null)
        sr.Dispose();
}
于 2012-07-13T09:01:23.153 に答える
-2

System.IO.StreamWriter は System.IDisposable です

あなたはそれを処分しなければなりません。そして、なぜあなたは開いていないものを閉じるのですか?

于 2012-07-13T09:01:08.423 に答える