3

より良いタイトルを思い出せませんでした、それをより良いものに自由に変更してください:)

私のアプリケーションには、次のような多くのロギングステートメントが含まれています。

var logger = new Logger(/*..get flag from settings if the logger should be active..*/);
// ....
logger.LogActivity(..serialize an object..);
//...
logger.LogActivity(..get another object's expensive overriden ToString method..);
//...
logger.LogActivity(..log something new..);

ロガークラス:

public class Logger
{
  private readonly bool _isActive;

  public Logger(bool isActive)
  {
    _isActive = isActive;
  }

  public void LogActivity(string activity)
  {
    if (_isActive)
    {
      // Save activity to Database.
    }
  }
}

設定でロガーを無効にすると(したがって、Loggerクラスの_isActiveフィールドがfalseになると)、データベースに何も保存されません。ただし、Logger.LogActivityメソッドのすべての式は引き続き評価され(たとえば、前の例の..serializeオブジェクト..)、これによりアプリケーションの速度が低下します。次のようなログステートメントを使用できます。

var logger = new Logger(/*..get flag from settings if the logger should be active..*/);
// ....
if (loggerIsActive) logger.LogActivity(..serialize an object..);
//...
if (loggerIsActive) logger.LogActivity(..get another object's expensive overriden ToString method..);
//...
if (loggerIsActive) logger.LogActivity(..log something new..);

ただし、LogActivityメソッドのみを変更する方がはるかに良いでしょう... LogActivityメソッドのみを変更して、ロガーが無効になっている場合にLogActivity呼び出しの式が評価されないようにすることは可能ですか?ええと-これがC#で可能だとしたら驚きますが、これを行う他の方法/パターンはありますか?

4

2 に答える 2

4

Func<string>ログに記録する文字列を生成する を受け取るオーバーロードを追加できます。

public void LogActivity(Func<string> activity)
{
    if (_isActive)
    {
        string log = activity();
        // save 'log' to database
    }
}

次に、次のように使用します。

logger.LogActivity(() => expensiveObject.ToString());
于 2012-06-20T10:57:04.493 に答える
1

パラメータの評価を完全に回避することはできませんが、ここで役立ついくつかの追加のログ記録方法を提供できます。

@Martin と @kenny は、ラムダ式を渡すことを提案しました。これにより、コードの評価が延期されますが、見苦しいクライアント コードが作成されます。数サイクル節約できるかもしれませんが、それだけの価値があるとは思えません。

いくつかの LogActivity オーバーライドを作成することをお勧めします。

LogActivity(string message) // logs the message
LogActivity(object obj) // calls obj.ToString() and logs it

本当に必要な場合は、ラムダ式のバリアントを保持します。

LogActivity(Func<String> func) // evaluates the function and logs its response

LogActivity を呼び出すコストを回避することはできないことに注意してください。C# は C ではなく、C のように機能するマクロはありません。それはほとんど問題ではありません。とにかく、そこにログメッセージを配置してください。

于 2012-06-20T11:24:14.440 に答える