3

私のアプリケーションには、次のようなファイルに定期的に行を書き込む非常に単純なロギングメカニズムがあります(ロギングライブラリは私のニーズには過剰です)。

private string logfile = @"C:\whatever.log";

public void WriteLine(string line)
{
   using(FileStream fs = File.Open(logfile, FileMode.Append))
   {
    // Log Stuff
   }
}

そのため、そのメソッドを呼び出すたびに、新しい FileStream が作成され、ログが終了した後に破棄されます。そこで、新しいオブジェクトが継続的に作成されるのを防ぐために、既にインスタンス化されたオブジェクトを使用することを検討しました。

private string logfile = @"C:\whatever.log";
private FileStream myStream = File.Open(logfile, FileMode.Append);

public void WriteLine(string line)
{
   using(myStream)
   {
    // Log Stuff
   }
}

ただし、スコープの問題により、MSDN リファレンスはこれ (最後の例) を推奨していません。その場合、人は何をしますか?最初の例のオーバーヘッドは無視できますか?

4

3 に答える 3

3

このステートメントは、オブジェクトusingのメソッドを呼び出す以外には何もしません。 したがって、2番目の例を考えると、メソッドへの最初の呼び出しの後、ファイルストリームが破棄されます。そのため、最初の呼び出しの後にこのメソッドを呼び出すと、例外が発生します。Dispose()
WriteLine(string)

クリスがコメントで提案したような方法を使用するのFile.AppendText()が道でしょう. ただし、このメソッドまたは他のFile...メソッドを使用すると、ストリームが開かれ、後で閉じて破棄されることに注意してください。
コードが少なくなるだけです。

于 2013-09-02T11:17:42.980 に答える
1

オーバーヘッドは無視できないかもしれませんが、それは問題外かもしれません。

を使用している場合using、リソースの作成、取得、および使用済みリソースの破棄は適切にスコープされています。どこから始まり、どこで使用され、どこで終了するかがわかります。

2 番目のシナリオに進む場合、どこで開始するか (含まれているクラスが作成されたとき) はわかりますが、その後は、それが使用される場所と、リソースが存在する場合はどこで制御するかをプラットフォームで保証する方法はありません。処分した。

これが重要なコードであり、含まれているクラスがIDisposable パターンを適切に実装している場合は、自分でこれを行うことができますが、これは注意が必要であり、気弱な人には適していません :)

ただし、「ロギング ライブラリは私のニーズには過剰です」という質問で述べたので、最小限のオーバーヘッドで問題ないと思います。FileIMHO、次のような既成の方法のいずれかで問題ないはずですFile.AppendAllText

public void WriteLine(string line)
{
   //add an enter to the end
   line += Environment.NewLine;
   File.AppendAllText(logfile, line);
}

またはFile.AppendAllLines:

public void WriteLine(string line)
{
   File.AppendAllLines(logfile, new []{line});
}
于 2013-09-02T11:14:14.933 に答える