Использование корпуса переключателя с потокобезопасным перечислением

Если у меня 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 или только один раз в начале?

Я бы напрямую использовал собственность. (Если, конечно, мне не нужно его значение где-то еще в моей функции, а его путь и имя действительно длинные)

BanForFun 02.05.2018 15:30

@mjwills работает в Windows 7/10 - x64 / x86. Как указано в связанном вопросе, для if ... else необходимо сначала прочитать. каково поведение оператора switch? читает ли он значение в каждом операторе case или читает только один раз в начале?

Xpleria 02.05.2018 15:35

@mjwills Как ты так сказал? В эквивалентном примере if .. else показано, что c сравнивается в каждом отдельном случае.

Xpleria 02.05.2018 15:51

Поместите точку останова в свой геттер. Сколько раз в него попали? О чем тебе это говорит?

mjwills 02.05.2018 15:53

Пока я не дойду до относительно большого фрагмента кода. Тем не менее, я на нем.

Xpleria 02.05.2018 15:55

@mjwills Вы правы. Он попадает только один раз. Так что мне не нужно читать это раньше.

Xpleria 02.05.2018 16:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Другие вопросы по теме