Does C# have a not Conditional
(!Conditional
, NotConditional
, Conditional(!)
) attribute?
i know C#
I liked the approach @Heliac mentioned and made a helper class for it:
class Build
{
public static bool IsDebug { get; private set; }
static Build()
{
CheckDebugMode();
}
[System.Diagnostics.Conditional("DEBUG")]
static void CheckDebugMode()
{
IsDebug = true;
}
}
Although the usefulness for DEBUG
isn't immediately
This allows you to do things like
static readonly bool UseCaching = !Build.IsDebug;
#ifndef ShowDebugString
#define RemoveSDS
#endif
?
edit: For more clarification. If ShowDebugString is defined Conditional["ShowDebugString"]
will be called. If ShowDebugString is not defined, Conditional["RemoveSDS"]
will be called.
True we can't 'NOT' ConditionalAttribute, but we can 'NOT' the condition as presented below.
// at the begining of the code before uses
#if DUMMY
#undef NOT_DUMMY
#else
#define NOT_DUMMY
#endif
// somewhere in class
[Conditional("NOT_DUMMY")]
public static void ShowDebugStringNOTDUMMY(string s)
{
Debug.Print("ShowDebugStringNOTDUMMY");
}
[Conditional("DUMMY")]
public static void ShowDebugStringDUMMY(string s)
{
Debug.Print("ShowDebugStringDUMMY");
}
hope this helps you solve your problem ;)
First, having the Conditional
attribute is not equivalent to having #if
inside the method. Consider:
ShowDebugString(MethodThatTakesAges());
With the real behaviour of ConditionalAttribute
, MethodThatTakesAges
doesn't get called - the entire call including argument evaluation is removed from the compiler.
Of course the other point is that it depends on the compile-time preprocessor symbols at the compile time of the caller, not of the method :)
But no, I don't believe there's anything which does what you want here. I've just checked the C# spec section which deals with conditional methods and conditional attribute classes, and there's nothing in there suggesting there's any such mechanism.
Just adding my 2 cents, three years down the line :-) ... I use a [Conditional("DEBUG")]
method to set an IsDebugMode
property to check the reverse. Hacky, but it works:
private bool _isDebugMode = false;
public bool IsDebugMode
{
get
{
CheckDebugMode();
return _isDebugMode;
}
}
[Conditional("DEBUG")]
private void CheckDebugMode()
{
_isDebugMode = true;
}
private void DisplaySplashScreen()
{
if (IsDebugMode) return;
var splashScreenViewModel = new SplashScreenVM(500)
{
Header = "MyCompany Deals",
Title = "Main Menu Test",
LoadingMessage = "Creating Repositories...",
VersionString = string.Format("v{0}.{1}.{2}",
GlobalInfo.Version_Major, GlobalInfo.Version_Minor, GlobalInfo.Version_Build)
};
SplashScreenFactory.CreateSplashScreen(splashScreenViewModel);
}
Nope.
Instead, you can write
#if !ShowDebugString
[Conditional("FALSE")]
#endif
Note that unlike [Conditional]
, this will be determined by the presence of the symbol in your assembly, not in your caller's assembly.