С#! Условный атрибут?
Имеет ли С# атрибут 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.
Ответы
Ответ 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 не указано ни одного. Поэтому я боюсь, что вам придется сворачивать самостоятельно!