Подтвердить что ты не робот

С#! Условный атрибут?

Имеет ли С# атрибут not Conditional (!Conditional, NotConditional, Conditional(!))?


я знаю, что С# имеет атрибут Conditional:

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

что эквивалентно 1:

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

Но в этом случае я хочу обратное поведение (вы должны специально отказаться):

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

Что побуждает меня попробовать:

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

который не компилируется. И:

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

который не компилируется. И:

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

который не компилируется, потому что это только желаемое за действительное.

1 Не правда, но достаточно верно. Не заставляй меня возвращать Angularок Nitpicker.

4b9b3361

Ответ 1

Во-первых, наличие атрибута Conditional не эквивалентно наличию #if внутри метода. Рассмотрим:

ShowDebugString(MethodThatTakesAges());

При реальном поведении ConditionalAttribute MethodThatTakesAges не вызывается - весь вызов, включая оценку аргумента, удаляется из компилятора.

Конечно, другой момент заключается в том, что это зависит от символов препроцессора во время компиляции во время компиляции вызывающей стороны, а не от метода :)

Но нет, я не верю в то, что делает то, что вы хотите здесь. Я только что проверил раздел спецификации С#, в котором рассматриваются условные методы и классы условных атрибутов, и там нет ничего, что предлагало бы такой механизм.

Ответ 2

Неа.

Вместо этого вы можете написать

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

Обратите внимание, что в отличие от [Conditional], это будет определяться наличием символа в вашей сборке, а не в вашей сборке вызывающих абонентов.

Ответ 3

Правда, мы не можем "NOT" ConditionalAttribute, но мы не можем "НЕ", как показано ниже.

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

надеюсь, что это поможет вам решить вашу проблему;)

Ответ 4

Просто добавив свои 2 цента, три года подряд:-)... Я использую метод [Conditional("DEBUG")] для установки свойства IsDebugMode для проверки обратного. Хакки, но он работает:

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

Ответ 5

#ifndef ShowDebugString
#define RemoveSDS
#endif

?

edit: Для уточнения. Если определено ShowDebugString, будет вызываться Conditional["ShowDebugString"]. Если ShowDebugString не определен, будет вызываться Conditional["RemoveSDS"].

Ответ 6

В аннотированной ссылке стандартная библиотека NET Framework не указано ни одного. Поэтому я боюсь, что вам придется сворачивать самостоятельно!