1

C# は C/C++ マクロをサポートしていません。StackOverflow にはこれに関する Q&A がたくさんありますが、具体的な質問への回答が見つかりませんでした。

http://logging.apache.org/log4net/release/faq.htmlで提案されているようなコードを使用しているとしましょう:

if(log.IsDebugEnabled) 
{
    log.Debug("Entry number: " + i + " is " + entry[i]);
}

ロギングを有効/無効にするこの方法には、明らかな欠点があります。C++ では、LOG(expr) のようなマクロを使用して、コードの読みやすさを改善し、コードの「if(log.IsDebugEnabled)」部分をより適切に制御します (これは、プロジェクトでおそらく何千回も繰り返されます)。

LOG(expr) を達成するにはどうすればよいですか? C# のような結果ですか?

ありがとう!

4

6 に答える 6

3

できません.... C# にはマクロがないためです。

もちろん、代わりに次のようなこともできます。

ラムダを取るログ関数を定義する

void Log(Func<string> f) {
  if(log.IsDebugEnabled) 
  {
    log.Debug(f());
  }
}

何かをログに記録したいときは、次のように呼び出します。

Log(()=>"Entry number: " + i + " is " + entry[i]);

このようにして、ログが有効になっている場合にのみ引数が評価されます。これは、あなたが達成したかったことだと思います。

(私のC#は少し錆びているので、構文が少しずれているかもしれません)

于 2012-10-25T08:09:41.330 に答える
1

これをメソッドとして定義し、デバッガ条件付きとしてマークできます。

internal static SomeClass
{
    [Conditional("DEBUG")] 
    internal static void Log(string expr)
    {
     //...
    }
}

コンパイラ定数 "DEBUG" が定義されていない場合、コンパイラはこのメソッドと、このメソッドへの呼び出しまたは参照を削除します。はい、それは他の人でも機能します。次のようになります。

internal static SomeClass
{
    #if DEBUG
    internal static void Log(string expr)
    {
     //...
    }
    #endif
}

ただし、それを使用してもこのメソッドへの参照は削除されないため、それらもラップする必要があります。


はい、これはコンパイル時にログを無効にすることのみを許可します。jalfには、実行時にこれを処理するためのより良いアプローチがあります。

于 2012-10-25T08:08:11.793 に答える
1

代わりに新しい log4netXXXXFormatメソッドを使用してください。それらは次のように実装されます。

public virtual void DebugFormat(string format, params object[] args)
{
    if (this.IsDebugEnabled)
    {
       this.Logger.Log(declaringType, m_levelDebug, String.Format(format, args));
    }
}

またString.Format、文字列の単純な連結の代わりに力があります

log.DebugFormat("Entry number: {0} is {1}", i, entry[i]);
于 2012-10-25T09:01:51.583 に答える
0

アイデアとして、文字列式を受け入れる 1 つの静的メソッドでクラスを作成できます。

于 2012-10-25T08:06:36.947 に答える
0

... コードの一部 (プロジェクトでおそらく千回も繰り返される)。

そのようなことを考えているときはいつでも、最初に頭に浮かぶはずのことは、カプセル化、カプセル化、カプセル化です。

IsDebugEnabledプロパティと独自のLogメソッドを持つ独自の Logger クラスを作成するだけです。

void Log( string message )
{
  if ( IsDebugEnabled ) 
  {
     log.Debug( message );
  }
}

おそらく、必要なすべての機能を既にサポートしている既存のロガー ライブラリを調べたほうがよいでしょう。

log4net

于 2012-10-25T08:07:33.573 に答える
-1

ロギングやキャッシングなどはビジネス ロジックとはほとんど関係がないため、アスペクト指向プログラミングが必要です。したがって、それらは分離する必要があります。

利用可能なフレームワークは多数あります。postsharp (http://www.sharpcrafters.com/) または snap (http://www.simpleaspects.com/) を参照してください。サポートされている依存性注入フレームワークのいずれかを使用する場合は、snap が適切な選択かもしれません。

更新: log4net を使用している場合は、構成ファイルからオフにできるはずです。<log4net threshold="OFF" />そのため、デバッグ構成とリリース構成が必要です。

于 2012-10-25T08:22:16.647 に答える