使用带螺纹安全枚举的开关盒

时间:2018-05-02 13:28:47

标签: c# switch-statement thread-safety

如果我有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;
    }
}

如果在this question中使用if ... else,我需要先读取该值。与switch声明是否相同? switch语句的行为是什么?它是在每个case语句中读取值还是在开头只读取一次?

1 个答案:

答案 0 :(得分:0)

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

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