Должен ли я считать, что двухэлементные перечисления останутся такими? - PullRequest
0 голосов
/ 06 марта 2009

Часто бывает так, что у меня два члена enum:

        enum  E{
            A,
            B
        }

Допустим, я хочу присвоить i другое значение в соответствии с моим значением enum.

я должен написать это:

        int i= (e== E.A)?0:1;

или это:

        int i;
        if (e==E.A)
            i=0;
        else if (e==E.B)
            i=1;
        else throw new NotImplementedException("Unknown enum member for E : " + e);

или, может быть, это:

        int i;
        switch (e)
        {
            case E.A:
                i = 0;
                break;
            case E.B:
                i=1;
                break;
            default:
                throw new NotImplementedException("Unknown enum member for E : " + e);
        }

Я обычно выбираю первый вариант, потому что писать гораздо быстрее, но я всегда чувствую себя немного не так. Что ты обычно делаешь?

Я разместил код на c #, но этот вопрос не связан с языком.

Я действительно не знаю, как это должно быть помечено, не стесняйтесь пометить его, если необходимо.

Редактировать: возможно, мой вопрос недостаточно ясен: что мне действительно интересно, так это то, могу ли я предположить, что мое перечисление никогда не изменится и пойдет по быстрому пути, или я должен считать, что оно может измениться (хотя еще не изменил его), и добавьте некоторый код обработки ошибок, чтобы я не тратил недели, отслеживая, где находится ошибка, если она когда-либо изменится)

Ответы [ 4 ]

3 голосов
/ 06 марта 2009

С точки зрения обслуживания, я бы рассматривал первый вариант как потенциальную ошибку и превращал его в оператор case, чтобы сделать поведение более явным. Я предполагаю, что это зависит от ожидаемой продолжительности жизни кода - чем дольше он будет работать, тем более явным вы должны его сделать.

1 голос
/ 06 марта 2009

Вопрос на самом деле связан с языком, потому что разные языки обрабатывают перечисления по-разному.

Первая версия сильно отличается от двух других из-за обработки ошибок. Если вас не волнует, что произойдет, если это ни A, ни B, просто используйте (в данном случае):

int i = (int) e;

Если требуемое значение int не совпадает напрямую, я бы либо воспользовался оператором switch, либо, возможно, даже использовал бы словарь (который был бы медленнее, но более компактным кодом с инициализаторами коллекции C # 3.0 и предоставил бы проверка аргументов бесплатно, если вас устраивает исключение, которое он выдает).

1 голос
/ 06 марта 2009

если в перечисление будут добавлены значения, будет проще добавить операторы в оператор switch, чем любой другой.

0 голосов
/ 29 апреля 2009

Последний из них - лучшая практика . Это более читабельно и более легко обслуживаемо. и, пожалуйста, не используйте первый!

...