VB developers have always used the #IF compiler directive to include or esclude portions of code from the application. The problem with this directive is that you can easily exclude a procedure with a single directive, but it isn't easy to discard all the calls to that procedure (which would raise a compilation error if you discard the target procedure).
VB.NET gives you a great alternative by means of the Conditional attribute. If you mark a procedure with this attribute the procedure itself will NOT be discarded, but all the calls to it will:
You can define compilation constants - LOG in the above case - in the Build page of the Project Properties dialog box. You can also use the already-defined TRACE and DEBUG compilation constants. Because the compiler can drop all the calls to the target method- LogMsg, in precedingvious example - the Conditional attribute can only work only with procedures that don't return a value. If your programming logic requires that a value be returned to the caller, you can use ByRef arguments.
<Conditional("LOG")> Sub LogMsg(ByVal MsgText As String)
LogMsg("Program is starting")
LogMsg("Program is ending")