Если у меня 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
или только один раз в начале?
@mjwills работает в Windows 7/10 - x64 / x86. Как указано в связанном вопросе, для if ... else
необходимо сначала прочитать. каково поведение оператора switch
? читает ли он значение в каждом операторе case
или читает только один раз в начале?
@mjwills Как ты так сказал? В эквивалентном примере if .. else
показано, что c
сравнивается в каждом отдельном случае.
Поместите точку останова в свой геттер. Сколько раз в него попали? О чем тебе это говорит?
Пока я не дойду до относительно большого фрагмента кода. Тем не менее, я на нем.
@mjwills Вы правы. Он попадает только один раз. Так что мне не нужно читать это раньше.
Как и предполагал @mjwills, я установил точку останова в геттере, и он был достигнут только один раз в начале оператора switch
. Я не могу найти какой-либо конкретной ссылки, где говорится, что оператор switch
считывает значение только один раз (прокомментируйте, если вы найдете ссылку). Но точка останова это доказывает.
Итак, хотя вам нужно заранее прочитать значение в случае if ... else
, в случае оператора switch
в этом нет необходимости.
Я бы напрямую использовал собственность. (Если, конечно, мне не нужно его значение где-то еще в моей функции, а его путь и имя действительно длинные)