Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In C#, is a Debug.Assert test run in release mode?

Take the following example:

public void Foo()
{
    //Code...

    Debug.Assert(ExpensiveTest());

    //Code...
}

What happens to the the Debug.Assert method when I compile in release mode? Would ExpensiveTest() still run? If not, then how does it work (since it is not a macro that can be set to evaluate to nothing)? If it does run, then doesn't that defeat the purpose of debug assertions?

like image 681
Matt Avatar asked Dec 13 '12 09:12

Matt


People also ask

What does || mean in C?

The logical OR operator ( || ) returns the boolean value true if either or both operands is true and returns false otherwise.

What is ?: operator in C?

In other words, we can also say that an operator is a symbol that tells the compiler to perform specific mathematical, conditional, or logical functions. It is a symbol that operates on a value or a variable. For example, + and - are the operators to perform addition and subtraction in any C program.

Is an operator in C?

Summary. An operator is a symbol which operates on a variable or value. There are types of operators like arithmetic, logical, conditional, relational, bitwise, assignment operators etc. Some special types of operators are also present in C like sizeof(), Pointer operator, Reference operator etc.

What is the use of in C?

In C/C++, the # sign marks preprocessor directives. If you're not familiar with the preprocessor, it works as part of the compilation process, handling includes, macros, and more.


4 Answers

What happens to the the Debug.Assert method when I compile in release mode?

It's completely removed (including the call to ExpensiveTest), assuming you don't have the DEBUG conditional compilation symbol defined in your release configuration.

If you look at the documentation, the declaration uses [ConditionalAttribute("DEBUG")]:

[ConditionalAttribute("DEBUG")]
public static void Assert(
    bool condition
)

ConditionalAttribute is used for conditional compilation. See Bart de Smet's blog post on conditional compilation for more details, along with section 17.4.2 of the C# 4 specification.

like image 146
Jon Skeet Avatar answered Oct 06 '22 10:10

Jon Skeet


Assertions in Managed Code - MSDN

In Visual Basic and Visual C#, you can use the Assert method from either Debug or Trace, which are in the System.Diagnostics namespace. Debug class methods are not included in a Release version of your program, so they do not increase the size or reduce the speed of your release code.

Also from the same link:

Note that calls to the Debug.Assert method disappear when you create a Release version of your code. That means that the call that checks the balance disappears in the Release version. To solve this problem, you should replace Debug.Assert with Trace.Assert, which does not disappear in the Release version

like image 24
Habib Avatar answered Oct 06 '22 10:10

Habib


According to Debug.Assert Method (Boolean) Debug methods are compiled only in debug builds.

So, it you build correct release build (see menu item Debug/Configuration Manager for details) this method call will be removed.

like image 5
Grzegorz Gierlik Avatar answered Oct 06 '22 12:10

Grzegorz Gierlik


Q. In C#, is a Debug.Assert test run in release mode?

The answer is "No." From Microsoft support: How to trace and debug in Visual C#:

You can use the Trace and the Debug classes separately or together in the same application. In a Debug Solution Configuration project, both Trace and Debug output are active. The project generates output from both of these classes to all Listener objects. However, a Release Solution Configuration project only generates output from a Trace class. The Release Solution Configuration project ignores any Debug class method invocations.

In particular, the last sentence makes it clear that Debug.Assert() statements (as well as other Debug class method invocations) are ignored in a Release build.

like image 2
DavidRR Avatar answered Oct 06 '22 11:10

DavidRR