我希望使用静态布尔值编写 C# 简单语句,该语句第一次返回 true,然后始终返回 false。
static bool _firstTime = true;
static bool FirstTime
{
get
{
bool old = _firstTime;
_firstTime = false;
return old;
}
}
这有效,但我正在寻找没有临时变量的更短的东西(这里是"旧"(。
谢谢。
您可以在 C# 中返回赋值的结果,这意味着您可以进行比较,如果firstTime
true
,则可以返回将其分配给false
的负数:
private static bool firstTime = true;
public static bool FirstTime => firstTime ? !(firstTime = false) : firstTime;
但是你的方式更容易理解。
注意:这与您的原始代码(您说"有效"(的线程安全完全相同,这意味着它不是线程安全的。
如果你想要一些线程安全和紧凑的东西,Interlocked.Exchange()
符合要求。 它将设置您的变量并以线程安全的方式返回旧值(与您在代码中所做的完全相同(。
唯一需要注意的是,您的私人字段不能成为布尔值。但是,无论公共财产背后发生什么,外部都无关紧要。
static int _isFirstTime = 1;
public static bool IsFirstTime => Interlocked.Exchange(ref _isFirstTime, 0) != 0;
您可能会滥用该&&
短路,如下所示。但是不要在工作中使用它,因为您的第一个示例更容易阅读。而且它不是线程安全的。
static bool _firstTime = true;
private static bool FirstTime
=> _firstTime && !(_firstTime = false);