首页 > 解决方案 > 使用带有线程安全枚举的 switch case

问题描述

如果我有Enum如下:

private object myEnumValLock = new object();
private MyEnum _myEnumVal;
public MyEnum MyEnumVal
{
    get
    {
        lock(this.myEnumValLock)
        {
            return this._myEnumVal;
        }
    }
    set
    {
        lock(this.myEnumValLock)
        {
            if (value != this._myEnumVal)
            {
                this.HandleNewMyEnumVal(this._myEnumVal, value);
                this._myEnumVal = value;
            }
        }
    }
}

使用switch case时,我可以直接使用这样的属性吗:

private void MyFunc()
{
    switch (this.MyEnumVal)
    {
        case MyEnum.First:
            // Do Something
            break;
        case MyEnum.Second:
            // Do Something
            break;
    }
}

或者我应该先阅读它,然后在读取值上使用开关,如下所示:

private void MyFunc()
{
    var myEnumVal = this.MyEnumVal;
    switch (myEnumVal)
    {
        case MyEnum.First:
            // Do Something
            break;
        case MyEnum.Second:
            // Do Something
            break;
    }
}

如果在这个问题if ... else中使用as ,我需要先读取该值。与语句相同吗?声明的行为是什么?它是在每个语句中读取值还是在开始时只读取一次?switchswitchcase

标签: c#switch-statementthread-safety

解决方案


正如@mjwillsswitch建议的那样,我在 getter 中放置了一个断点,它在语句开头只被击中一次。我找不到任何具体的参考,它说该switch语句只读取一次值(如果你找到参考,请发表评论)。但是断点确实证明了这一点。

因此,虽然您需要在 的情况下事先读取值,但if ... elseswitch语句的情况下,您不需要。


推荐阅读