在堆栈跟踪对象上使用调用者信息属性会更好吗?有什么区别?
考虑以下使用调用者信息属性进行日志记录的代码。
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
.
我不喜欢调用者信息属性的一件事是,尽管它们不必作为参数传入,但必须在要使用它们的每个方法上将它们定义为方法参数,这违反了 DRY 原则。