我正在滚动我自己的记录器类,并希望在应用程序通过不同阶段时表示日志的层次结构:
log start
loading
loaded 400 values
processing
couldn't process var "x"
Run Code Online (Sandbox Code Playgroud)
等等
在C++中(是的,我知道),我会使用RAII类在创建时将自己压在日志堆栈上,并在它们离开作用域时弹出.然后,您可以在任何时候离开函数并仍然具有一致的日志记录.
显然在C#中,任何变量都必须是新的,所以在下一个垃圾收集周期之前它不会被删除,如果你立即创建一个新的classlet,你可能会有一个不同步的记录器.
人们如何在C#中尝试解决这个问题?我希望记录器语法尽可能不引人注目,并且仍然支持具有多个出口点的函数.
我能想到的唯一解决方案是让closeHeirarchy()调用每个return语句 - 而且你知道我会在某个地方错过一个.
编辑:我应该说清楚我主要对如何在c#中复制RAII行为感兴趣.是否存在提供相同行为的机制?
如果将using语句与IDisposable类一起使用,则可以获得所询问的行为.
做这样的事情:
public class LogContext: IDisposable
{
private readonly Logger _logger;
private readonly string _context;
public LogContext(Logger logger, string context){
_logger = logger;
_context = context;
_logger.EnterContext(_context);
}
public void Dispose(){
_logger.LeaveContext(_context);
}
}
//...
public void Load(){
using(new LogContext(logger, "Loading")){
// perform load
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
593 次 |
| 最近记录: |