Использование переключателя с перечислением безопасности - PullRequest
0 голосов
/ 02 мая 2018

Если у меня есть 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;
            }
        }
    }
}

При использовании регистра переключателя я могу напрямую использовать свойство следующим образом:

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 как в этом вопросе , мне нужно сначала прочитать значение. То же самое с оператором switch? Каково поведение оператора switch? Читает ли оно значение в каждом операторе case или читает только один раз в начале?

1 Ответ

0 голосов
/ 02 мая 2018

Как и предполагал @ mjwills , я установил точку прерывания в геттере, и она достигла цели только один раз в начале оператора switch. Я не могу найти какую-либо конкретную ссылку, где говорится, что оператор switch читает значение только один раз (пожалуйста, прокомментируйте, если найдете ссылку). Но точка останова доказывает это.

Таким образом, хотя вам необходимо предварительно прочитать значение в случае if ... else, в случае оператора switch вам не нужно.

...