スタックトレースオブジェクトに対して呼び出し元情報属性を使用する方がよいですか?違いは何ですか?
ロギングに発信者情報属性を使用する次のコードについて考えてみます。
public void Log(
string message,
[CallerMemberName] string memberName = null,
[CallerFilePath] string filePath = null,
[CallerLineNumber] int lineNumber = 0)
{
// Do logging.
}
StackTrace
私のテストから、同じ結果がクラスを使用して達成することができます。
public void Log(string message)
{
StackTrace trace = new StackTrace(true);
StackFrame frame = trace.GetFrame(1);
string filePath = frame.GetFileName();
int lineNumber = frame.GetFileLineNumber();
string memberName = frame.GetMethod().Name;
// Do logging.
}
私が見た唯一の違いは、匿名メソッドの場合です。ここStackTrace
には、のような呼び出し元メソッドの生成された名前が含まれています<MyMethod>b_a
。
呼び出し元情報属性について私が気に入らない点の1つは、引数として渡す必要はありませんが、DRYの原則に違反して、使用するすべてのメソッドでメソッドパラメーターとして定義する必要があることです。