我正在滚动我自己的记录器类,并希望在应用程序通过不同阶段时表示日志的层次结构:
log start loading loaded 400 values processing couldn't process var "x"
等等
在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 } }