C# Conditional Attribute

Use the Conditional attribute from System.Diagnostics. A Conditional method is compiled when a define is present.

Conditional. A Conditional method is not always executed. It is compiled into the program only when certain symbols are defined with #define. The Conditional attribute enables this feature. It accepts a string literal as its argument.Attribute
Argument: The string argument is the text of the symbol that must be defined for the method to be compiled.

To start, this example program has 2 methods other than the Main entry point. It contains a MethodA, which is conditional on the symbol PERLS. It also contains MethodB, which is conditional on the symbol DOT.
Note: At the top of the program, you can see 2 preprocessor directives. The symbol PERLS is defined. The symbol DOT is not.
Note 2: The execution of the program shows that MethodA is executed, but MethodB is not.
Warning: It isn't possible to use Conditional on methods that return a value. Methods must be used in the void context.
And: This is because variables can be assigned to method return values. You can work around this limitation using parameters.
C# program that uses Conditional attribute #define PERLS #undef DOT using System; using System.Diagnostics; class Program { static void Main() { MethodA(); MethodB(); } [Conditional("PERLS")] static void MethodA() { Console.WriteLine(true); } [Conditional("DOT")] static void MethodB() { Console.WriteLine(false); } } Output True

Conditional List. It is possible to modify a collection in only DEBUG mode. This way, you can add strings or other values to your array conditionally—when debugging your application, not when it's deployed. The Conditional attribute is ideal here.List
Tip: You can use clunky #if and #endif directives all over your code, but this is an eyesore and also prone to typos.
AddToArray: It defines an AddToArray method, which simply adds two elements to the array. It uses the Conditional("DEBUG") attribute.
Info: This means to only compile the method if DEBUG is defined. The Conditional attribute requires System.Diagnostics.
C# program that uses conditional method using System; using System.Collections.Generic; using System.Diagnostics; class Program { static void Main() { List<string> l = new List<string>(); l.Add("rabbit"); l.Add("bird"); AddToArray(l); Console.WriteLine("Elements: {0}", l.Count); Console.Read(); } [Conditional("DEBUG")] static void AddToArray(List<string> l) { // New array string[] a = new string[2]; a[0] = "cat"; a[1] = "mouse"; // Add array to end of list l.AddRange(a); } } Output of the program in DEBUG Elements: 4 Output of the program in RELEASE Elements: 2

Reduce attack surface. Always disable DEBUG on deployed web sites and applications. This reduces the attack surface, as it removes many developer-specific knobs. The Conditional attribute is ideal for separating DEBUG logic.
Note: In the example, Main() doesn't know "cat" and "mouse" even exist. This clarifies the code.

You can encapsulate your DEBUG-specific logic in separate Conditional("DEBUG") methods. Don't let any debug logic slip into your release builds. This improves code clarity and performance, and reduces attack surface.

Summary. Conditional allows us to create a method whose existence depends on a preprocessor directive. Unlike using #ifdef directives the Conditional attribute fits with the clear syntax of the C# language.
Note: This syntax is more high-level, less lexical. It is a declarative programming pattern.
Thus: The Conditional attribute helps maintain descriptive and easy-to-maintain source code.

© 2007-2020 Sam Allen. Every person is special and unique. Send bug reports to info@dotnetperls.com.