2015-01-22 4 views
-3

Я читаю о Enums и наткнулся на пример, в котором автор показал, как мы можем typecastenum к int и int к enum. Однако я не получил, как мы можем изменить значение перечисления, создав ссылку типа TrickScore.Изменить значение Enum

public enum TrickScore { 
    Sit = 7, 
    Beg = 25, 
    RollOver = 50, 
    Fetch = 10, 
    ComeHere = 5, 
    Speak = 30, 
} 

Этот блок кода изменяет значение Fetch перечисления. Я не могу понять, как устанавливается балл TrickScore.Fetch. Когда я звоню score.ToString(), он возвращает Fetch.

int value = (int)TrickScore.Fetch * 3; 
MessageBox.Show(value.ToString()); 
TrickScore score = (TrickScore)value; 
MessageBox.Show(score.ToString()); 
+7

Нет [не] (https://dotnetfiddle.net/ZehC73). Он возвращает 'Speak', потому что' 10 * 3 = 30' и '30' - значение для' Speak'. Также, пожалуйста, не смешивайте счетчик с перечислением (enum). –

+2

И, чтобы уточнить, значения в 'TrickScore' являются постоянными. Они не могут быть изменены, и вы не можете назначать им новые значения. То, что вы думаете, что вы делаете, на самом деле не происходит. –

+0

Теперь я получил! – Insafian

ответ

0

Я боюсь, что ваше понимание enums не совсем верно. Эта строка кода:

int value = (int)TrickScore.Fetch * 3; 

не изменяет значение TrickScore.Fetch. Он принимает значение TrickScore.Fetch (10) умножает его на 3 и присваивает его переменной value. В этом случае вы используете TrickScore.Fetch почти так же, как если бы это была переменная, которая хранит число. Когда у вас есть что-то вроде y = x * 5, вы не изменяете значение x. Назначение результата только y.

Следующая строка кода, который делает что-то это один:

TrickScore score = (TrickScore)value; 

Так у вас есть переменная value (30) от предыдущей операции. Вы задаете значение TrickScore типа перечисления. Элемент с этим номером равен Speak и присваивается переменной score.

Одна вещь стоит отметить, что только потому, что enum наследует от int не означает, что это хорошая практика для выполнения арифметических операций над enums. Я бы не стал бросать их на int и выполнять математические операции. В конце концов, действительно ли имеет смысл добавить TrickScore.Beg и TrickScore.ComeHere и ожидать, что это приведет к TrickScore.Speak?

+1

«Не делать математику с перечислениями» немного шире. Это не имеет смысла, когда числовые значения не имеют значения (как в этом случае), но это может иметь смысл, когда они это делают. Например, с перечислением, представляющим дни недели, может иметь смысл сказать «завтра = сегодня + 1» (хотя вам нужно обрабатывать граничные условия, поэтому что-то вроде: «завтра = (сегодня + 1)% (daysOfTheWeek.Sunday + 1) '). Также имеет смысл иметь дело с флагами для использования логических операторов. –

+0

@MattBurland Я определенно согласен, что при работе с флагами побитовые операции очень удобны. Кроме того, я не сказал «не делаю математику», а скорее «это не рекомендуется». Тем не менее, как вы указали, бывают случаи, когда это может быть полезно. Но это не обычное дело. И даже тогда вы должны быть очень осторожны. Что касается вашего примера: 1) как это имеет смысл, что вторник + среда == Пятница; 2) что я должен получить при бросании 8 на 'daysOfWeek'? Понедельник? Как 8 и понедельник связаны. Кроме того, при кастинге 15 я получу понедельник. Так внезапно куча чисел равна понедельнику, что сбивает с толку. – PiotrWolkowski

+0

Я все еще думаю, что даже «не рекомендуется» является слишком широким заявлением. «не делайте этого, когда фактические цифры бессмысленны» будет прекрасным заявлением. Что касается ваших других моментов, то кастинг '15' абсолютно не дает вам' Monday', он дает вам '15'. Enums автоматически не переносят свои значения (поэтому у меня была мода ('%')). Добавление «Вторник + среда» явно бессмысленно и не должно быть сделано. Может быть пример, когда добавление двух перечислений вместе (по сравнению с добавлением int и enum) может иметь смысл, но я не могу думать об этом прямо сейчас. –

Смежные вопросы