Использование Trace и Debug для задания утверждений

Использование Trace и Debug для задания утверждений

Для задания проверочных утверждений в C# коде используются два метода Trace.Assert и Debug.Assert. Использовать их довольно просто. Достаточно указать условие проверки и если оно ложно, то утверждение генерирует ошибку.

static void Main(string[] args)
{
	TraceDemo(-1);
	DebugDemo(-1);
}

private static void TraceDemo(int value)
{
	Trace.Assert(value > 0);
	Console.WriteLine(value);
}

private static void DebugDemo(int value)
{
	Debug.Assert(value > 0);
	Console.WriteLine(value);
}

В данном коде оба условия ложны, потому при выполнее данной программы, мы получим сразу две ошибки.

Интересной особенностью является то, что Debug утверждения работают только в режиме отладки, т.е. приложение собранное в Release-конфигурации будет без них. В то же время Trace-утверждения работают везде. Это нужно учитывать при разработке ведь Debug-утверждения не приводят к увеличения сборок, так как компилятор их пропускает. В тоже самое время Trace добавляет дополнительную нагрузку (проверка утверждений, размер сборок).

Описанное выше легко проверить открыв сборку в IL DASM.

.method private hidebysig static void  DebugDemo(int32 'value') cil managed
{
  // Code size       19 (0x13)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldc.i4.0
  IL_0003:  cgt
  IL_0005:  call       void [System]System.Diagnostics.Debug::Assert(bool)
  IL_000a:  nop
  IL_000b:  ldarg.0
  IL_000c:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0011:  nop
  IL_0012:  ret
} // end of method TraceDebugProgram::DebugDemo

.method private hidebysig static void  TraceDemo(int32 'value') cil managed
{
  // Code size       19 (0x13)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  ldc.i4.0
  IL_0003:  cgt
  IL_0005:  call       void [System]System.Diagnostics.Trace::Assert(bool)
  IL_000a:  nop
  IL_000b:  ldarg.0
  IL_000c:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0011:  nop
  IL_0012:  ret
} // end of method TraceDebugProgram::TraceDemo

Пересобрав сборку в Release режиме IL DASM показывает следующий код.

.method private hidebysig static void  DebugDemo(int32 'value') cil managed
{
  // Code size       7 (0x7)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0006:  ret
} // end of method TraceDebugProgram::DebugDemo

.method private hidebysig static void  TraceDemo(int32 'value') cil managed
{
  // Code size       16 (0x10)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.0
  IL_0002:  cgt
  IL_0004:  call       void [System]System.Diagnostics.Trace::Assert(bool)
  IL_0009:  ldarg.0
  IL_000a:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_000f:  ret
} // end of method TraceDebugProgram::TraceDemo

Как видно метод DebugDemo лишился вызова Debug.Assert. Если теперь запустить программу на выполнение, то пользователь увидит только одну ошибку, так как код проверка в DebugDemo отсутствует.

Комментарии

Оставить комментарий