Репликация C ++ RAII в C # - PullRequest
       21

Репликация C ++ RAII в C #

3 голосов
/ 23 января 2009

Я прокручиваю свой собственный класс логгеров и хочу представить иерархию логов, когда приложение проходит различные фазы:

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

и т.д.

В C ++ (да, я знаю), я бы использовал классы RAII, которые помещались в стек журналов при создании и выталкивались, когда выходили из области видимости. Затем вы можете оставить функции в любой точке и при этом вести последовательную запись.

Очевидно, что в C # любая переменная должна быть новой, поэтому она не будет удалена до следующего цикла сборки мусора, и если вы сразу создадите новый класслет, у вас может быть несинхронизированный регистратор.

Как бы люди попытались решить эту проблему в C #? Я хочу, чтобы синтаксис регистратора был как можно более незаметным для текущей функции, и при этом поддерживаю функции с несколькими точками выхода.

Единственное решение, которое я могу придумать, - это закрыть, что closeHeirarchy () вызывает каждое выражение return - и вы знаете, что я где-то пропущу одно.


Редактировать: Я должен дать понять, что меня интересует, главным образом, то, как бы вы повторили поведение RAII в c #. Есть ли механизм, обеспечивающий идентичное поведение?

Ответы [ 3 ]

5 голосов
/ 23 января 2009

Вы можете получить запрашиваемое поведение, если используете оператор , используя , с классом 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
  }
}
3 голосов
/ 23 января 2009

OffTopic: Если вы хотите, чтобы «синтаксис регистратора был как можно более ненавязчивым» к клиентскому коду, возможно, вы захотите взглянуть на Аспектно-ориентированное программирование после завершения вашего регистратора. Но, возможно, вам следует выбрать короткий, менее болезненный маршрут и использовать любой из лучших доступных логгеров (log4Net, NLog, System.Trace или даже Spring.Commonlogging).

1 голос
/ 23 января 2009

System.Diagnostics.Trace стоит посмотреть. Он поддерживает такие вещи, как уровень отступа, например. Проект log4net также стоит проверить.

...