Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Will the expression provided to Debug.Assert be evaluated in a release build?

Say I have a rather expensive assertion:

bool IsCompatible(Object x, Object y) { 
  // do expensive stuff here
}

If I test this assertion with:

Debug.Assert(IsCompatible(x,y));

Will IsCompatible be executed in release builds?

My understanding is that Debug.Assert being marked as [Conditional("DEBUG")], calls to it will only be emitted in debug builds. I'm thinking that this won't prevent the expression from being evaluated in release mode though, since the method call may have side effects, only the passing of the result to Debug.Assert wouldn't be emitted. Is that correct?

Should I be doing:

#if DEBUG
Debug.Assert(IsCompatible(x,y));
#endif

To ensure that I don't pay the cost of IsCompatible in release mode?

like image 812
MarkPflug Avatar asked Nov 14 '12 17:11

MarkPflug


1 Answers

No.

Debug.Assert is decorated with [Conditional("DEBUG")].

When the compiler compiles a call to this method, it will remove that entire statement unless DEBUG is defined in the calling project.

like image 170
SLaks Avatar answered Sep 22 '22 10:09

SLaks