76 votes

C #! Attribut conditionnel?

Est-ce que C# ont pas Conditional (!Conditional, NotConditional, Conditional(!)) attribut?


je sais que C# a Conditional d'attribut:

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

ce qui est équivalent1 à:

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

Mais dans ce cas, je veux l' inverse de comportement (vous devez expressément opt out):

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

Ce qui m'amène à essayer:

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

ce qui ne veut pas compiler. Et:

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

ce qui ne veut pas compiler. Et:

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

ce qui ne veut pas compiler, car c'est seulement un vœu pieux.

1Pas vrai, mais c'est vrai. Ne me faites pas de ramener le Nitpicker du Coin.

60voto

Jon Skeet Points 692016

Tout d'abord, l' Conditional attribut est pas équivalent au fait d' #if , au lieu de la méthode. Considérer:

ShowDebugString(MethodThatTakesAges());

Avec le comportement réel de la ConditionalAttribute, MethodThatTakesAges n'est pas appelée - l'ensemble de l'appel , y compris l'argument de l'évaluation est supprimé à partir du compilateur.

Bien sûr, l'autre point est que cela dépend du moment de la compilation des symboles de préprocesseur au moment de la compilation de l' appelant, et non pas de la méthode :)

Mais non, je ne crois pas qu'il y ait quelque chose qui fait ce que vous voulez ici. J'ai juste vérifié le C# spec section 17.4.2 qui traite avec conditionnelle méthodes et à la condition que l'attribut des classes, et il n'y a rien là ce qui suggère il y a un tel mécanisme.

59voto

SLaks Points 391154

Nan.

Au lieu de cela, vous pouvez écrire

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

Notez que contrairement à [Conditional] , cela sera déterminé par la présence du symbole dans votre assembly et non dans celle de votre appelant.

18voto

Heliac Points 522

J'ajoute simplement mes 2 centimes, trois ans plus tard :-) ... J'utilise une méthode [Conditional("DEBUG")] pour définir une propriété IsDebugMode afin de vérifier l'inverse. Hacky, mais ça marche:

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

5voto

Kyle W Points 1649
 #ifndef ShowDebugString
#define RemoveSDS
#endif
 

?

edit: Pour plus de précisions. Si ShowDebugString est défini, Conditional["ShowDebugString"] sera appelé. Si ShowDebugString n'est pas défini, Conditional["RemoveSDS"] sera appelé.

0voto

Roy Dictus Points 19568

La référence annotée de la bibliothèque standard standard NET n'en dit pas. J'ai bien peur que vous deviez rouler le vôtre!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X