> -- Иван Кузьмицкий писал(а):
> Сергей, не могли бы Вы пару слов сказать про эпохи? Ну так, в общем. Это ведь та самая , да?Не совсем та самая (я на C#), но так же целое число.

Папа всех диагностируемых объектов (поле nextDiagnosticsObject - для временного образования очереди (точнее стэка) во время обхода):## Код:
```
public static partial class Diagnostics
{
   public abstract class Object
   {
      internal readonly Type diagnosticsType;
      internal int currentDiagnosticsEra;
      internal Object nextDiagnosticsObject;

      public Type DiagnosticsType { get { return this.diagnosticsType; } }

      public Object ()
      {
         lock (synchRoot)
         {
            this.diagnosticsType = ...
         }
      }

      protected internal virtual void Traverse ()
      {
      }
   }
}
```
Принципиальная схема механизма:## Код:
```
public static partial class Diagnostics
{
   private static readonly object synchRoot = new object();
   private static int traverseEra;
   private static Object traverseFirst;
   private static System.Threading.Thread traverseThread;

   public static void Traverse (Object obj)
   {
      if ((obj != null) && (obj.currentDiagnosticsEra != traverseEra) && (traverseThread == System.Threading.Thread.CurrentThread))
      {
         obj.currentDiagnosticsEra = traverseEra;
         obj.nextDiagnosticsObject = traverseFirst;
         traverseFirst = obj;
      }
   }

   public static void TraverseRoot (Object root)
   {
      ...
      traverseEra++;
      if (traverseEra == 0) { traverseEra = 1; }
      root.currentDiagnosticsEra = traverseEra;
      traverseFirst = root;
      traverseThread = System.Threading.Thread.CurrentThread;
      while (traverseFirst != null)
      {
         Object obj = traverseFirst;
         traverseFirst = traverseFirst.nextDiagnosticsObject;
         obj.nextDiagnosticsObject = null;
         obj.Traverse();
         ...
      }
      ...
   }
}
```
Пример:## Код:
```
public class Node: Diagnostics.Object
{
   private Node left;
   private Node right;
                  
   protected override void Traverse ()
   {
      Diagnostics.Traverse(this.left);
      Diagnostics.Traverse(this.right);
   }
}
```
