visual variable test tag studio ifdebug development define debug check c# conditional conditional-compilation

variable - C#! Atributo condicional?



tag debug c# (6)

¿Tiene C # un atributo no Conditional ( !Conditional , NotConditional Conditional(!) , Conditional(!) )?

Sé que C # tiene un atributo Conditional :

[Conditional("ShowDebugString")] public static void ShowDebugString(string s) { ... }

que es equivalente a 1 a:

public static void ShowDebugString(string s) { #if ShowDebugString ... #endif }

Pero en este caso quiero el comportamiento inverso (tienes que inhabilitarlo específicamente):

public static void ShowDebugString(string s) { #if !RemoveSDS ... #endif }

Lo que me lleva a probar:

[!Conditional("RemoveSDS")] public static void ShowDebugString(string s) { ... }

que no compila Y:

[Conditional("!RemoveSDS")] public static void ShowDebugString(string s) { ... }

que no compila Y:

[NotConditional("RemoveSDS")] public static void ShowDebugString(string s) { ... }

que no compila porque es solo una ilusión.

1 No es cierto, pero es suficientemente cierto. No me hagas regresar el Nitpicker''s Corner.


Es cierto que no podemos ''NO'' ConditionalAttribute, pero podemos ''NO'' la condición que se presenta a continuación.

// 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"); }

espero que esto te ayude a resolver tu problema;)


La referencia anotada de la biblioteca estándar de NET Framework no establece ninguna. ¡Así que me temo que tendrás que hacer tu propio!


Nop.

En cambio, puedes escribir

#if !ShowDebugString [Conditional("FALSE")] #endif

Tenga en cuenta que a diferencia de [Conditional] , esto estará determinado por la presencia del símbolo en su conjunto, no en el conjunto de su interlocutor.


Primero, tener el atributo Conditional no es equivalente a tener #if lugar del método. Considerar:

ShowDebugString(MethodThatTakesAges());

Con el comportamiento real de ConditionalAttribute , MethodThatTakesAges no se llama: toda la llamada, incluida la evaluación de argumentos, se elimina del compilador.

Por supuesto, el otro punto es que depende de los símbolos del preprocesador de tiempo de compilación en el tiempo de compilación de la persona que llama , no del método :)

Pero no, no creo que haya nada que haga lo que quieras aquí. Acabo de consultar la sección de especificaciones de C # 17.4.2, que trata de los métodos condicionales y las clases de atributos condicionales, y no hay nada allí que sugiera que exista tal mecanismo.


Solo agrego mis 2 centavos, tres años en la línea :-) ... Utilizo un método [Conditional("DEBUG")] para establecer una propiedad IsDebugMode y verificar el reverso. Hacky, pero funciona:

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); }


#ifndef ShowDebugString #define RemoveSDS #endif

?

editar: para más aclaraciones. Si se define ShowDebugString Conditional["ShowDebugString"] se llamará. Si ShowDebugString no está definido, se Conditional["RemoveSDS"] .