一个静态属性,第一次返回 true,之后始终返回 false



我希望使用静态布尔值编写 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);

最新更新