ファイル操作にクラスを使用しStreamWriter
ていますが、このコードに表示されていない問題はありますか?
try catch finally
ブロックに入れる必要がありますか?
StreamWriter sr = new StreamWriter(streamFolder);
sr.Write(details);
File.SetAttributes(streamFolder, FileAttributes.Hidden);
sr.Close();
ファイル操作にクラスを使用しStreamWriter
ていますが、このコードに表示されていない問題はありますか?
try catch finally
ブロックに入れる必要がありますか?
StreamWriter sr = new StreamWriter(streamFolder);
sr.Write(details);
File.SetAttributes(streamFolder, FileAttributes.Hidden);
sr.Close();
コードの何が問題になっていますか?ストリームを閉じる前に何らかの例外が発生した場合、ストリームは開いたままになり、システムリソースは解放されません。
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メソッドの実装について詳しく読むことができます。
おそらく using ステートメントを使用する必要があります。
using (StreamWriter sr = new StreamWriter(streamFolder))
{
sr.Write(details);
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
using ブロックの最後で、例外が発生したか、コードが正常に実行されたかにかかわらず、StreamWriter.Dispose が呼び出されます。
使用したい:
using (StreamWriter sr = new StreamWriter(streamFolder))
{
sr.Write(details);
File.SetAttributes(streamFolder, FileAttributes.Hidden);
}
は必要ありませんClose
。
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();
}
System.IO.StreamWriter は System.IDisposable です
あなたはそれを処分しなければなりません。そして、なぜあなたは開いていないものを閉じるのですか?