C# !Conditional attribute?

前端 未结 7 1310
既然无缘
既然无缘 2020-12-08 18:08

Does C# have a not Conditional (!Conditional, NotConditional, Conditional(!)) attribute?


i know C#

相关标签:
7条回答
  • 2020-12-08 18:35

    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;
    
    0 讨论(0)
  • 2020-12-08 18:37
    #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.

    0 讨论(0)
  • 2020-12-08 18:43

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

    0 讨论(0)
  • 2020-12-08 18:49

    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.

    0 讨论(0)
  • 2020-12-08 18:51

    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);
    }
    
    0 讨论(0)
  • 2020-12-08 18:54

    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.

    0 讨论(0)
提交回复
热议问题