C#是否有不 Conditional
(!Conditional
,NotConditional
,Conditional(!)
)属性?
我知道C#有Conditional
attribute:
[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 Not true, but true enough. Don't make me bring back the Nitpicker's Corner.
答案 0 :(得分:53)
首先,让Conditional
属性不等同于使用#if
代替方法。考虑:
ShowDebugString(MethodThatTakesAges());
对于ConditionalAttribute
的真实行为,MethodThatTakesAges
未被调用 - 整个调用包括参数评估将从编译器中删除。
当然另一点是它依赖于调用者编译时的编译时预处理器符号,而不是方法:)
但不,我不相信在这里有什么能做你想要的。我刚刚查看了C#规范部分17.4.2,该部分处理条件方法和条件属性类,并且没有任何内容表明存在任何此类机制。
答案 1 :(得分:41)
不。
相反,你可以写
#if !ShowDebugString
[Conditional("FALSE")]
#endif
请注意,与[Conditional]
不同,这将取决于程序集中符号的存在,而不是调用者程序集中的符号。
答案 2 :(得分:17)
确实,我们不能' NOT' ConditionalAttribute,但我们不能' NOT'条件如下。
// 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");
}
希望这可以帮助您解决问题;)
答案 3 :(得分:12)
只需添加我的2美分,三年下线:-) ...我使用[Conditional("DEBUG")]
方法设置IsDebugMode
属性来检查相反的情况。 Hacky,但它确实有效:
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);
}
答案 4 :(得分:0)
.NET框架标准库带注释的引用没有说明任何内容。所以我担心你不得不自己动手!
答案 5 :(得分:0)
我喜欢@Heliac提到的方法,并为此创建了一个辅助类:
class Build
{
public static bool IsDebug { get; private set; }
static Build()
{
CheckDebugMode();
}
[System.Diagnostics.Conditional("DEBUG")]
static void CheckDebugMode()
{
IsDebug = true;
}
}
尽管对DEBUG
的用处不是很快
这可以让您做类似的事情
static readonly bool UseCaching = !Build.IsDebug;