代码之家  ›  专栏  ›  技术社区  ›  tenpn

在C中复制C++的RAII#

  •  3
  • tenpn  · 技术社区  · 16 年前

    我正在滚动我自己的logger类,并希望在应用程序经过不同阶段时代表日志的继承权:

    log start
        loading
            loaded 400 values
        processing
             couldn't process var "x"
    

    在C++中(我知道),我会使用RAII类,当创建时,它们将自己推到日志堆栈上,当它们离开作用域时弹出。然后,您可以在任何时候离开函数,并且仍然保持一致的日志记录。

    显然,在C#中,任何变量都必须是新的,因此在下一个垃圾收集周期之前它不会被删除,而且如果您立即创建一个新的classlet,您可能会有一个不同步的记录器。

    人们会如何用C#解决这个问题?我希望记录器语法尽可能不影响当前函数,并且仍然支持具有多个出口点的函数。

    我能想到的唯一解决方案是closeHeirarchy()调用每个返回语句——你知道我会在某个地方错过一个。


    编辑:我应该说清楚,我主要感兴趣的是如何在c#中复制RAII行为。是否有提供相同行为的机制?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Rasmus Faber    16 年前

    如果您使用 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
      }
    }
    
        2
  •  3
  •   tobsen    16 年前

    但是,也许你应该选择一条不那么痛苦的短路线,使用任何一款优秀的记录器(log4Net、NLog、System.Trace甚至Spring.Commonlogging)。

        3
  •  1
  •   Joel Coehoorn    16 年前

    System.Diagnostics.Trace 值得一看。例如,它支持缩进级别之类的功能。这个 log4net