В C # есть ли способ определить перечисление и экземпляр этого перечисления одновременно? - PullRequest
7 голосов
/ 30 мая 2011

Требуется оптимизация кода в c #, которая позволяет мне одновременно определять перечисление и создавать переменную типа этого перечисления:

До:

    enum State {State1, State2, State3};
    State state = State.State1;

После (неработа):

    enum State {State1, State2, State3} state;
    state = State.State1;

Есть ли что-нибудь подобное?

Ответы [ 5 ]

8 голосов
/ 30 мая 2011

Это не поддерживается в C #, но, возможно, вы можете обойти это и сделать что-то «рядом» с перечислением, используя кортежи или анонимные типы, если вам нужно только переключить какое-то состояние и вам не нужно делать никаких специальныхоперации с ним.

Например, используя кортежи, вы можете сделать это:

var someFakeEnum = Tuple.Create(0, 1);

ОБНОВЛЕНИЕ :

В C # 7 введены синтаксические кортежи:

var someFakeEnum = (State1: 0, State2: 1);

Или с анонимными типами:

var someFakeEnum = new { State1 = 0, State2 = 1 };

И после этого вы можете сделать что-то вроде:

int state = 0;

// If you're using tuples...
if(some condition)
{
    state = someFakeEnum.Item2;
}

// ...or if you're using anonymous types or C# >= 7 tuples...
if(some condition) 
{
    state = someFakeEnum.State2;
}

Очевидно, что это не фактическое перечисление, и у вас нет сахара, который предоставляет тип Enum, но вы все равно можете использовать бинарные операторы, такие как OR, AND, или условные выражения, как любое другое действительное перечисление.

5 голосов
/ 30 мая 2011

Это не оптимизация.

Нет, ничего подобного не существует, и на то есть веские причины.Он гораздо менее читабелен, и при этом можно получить абсолютно ноль преимуществ.Объявите их в двух отдельных утверждениях и покончите с этим.

Если вам буквально платят за сокращение количества строк в исходном коде, напишите это так:

enum State {State1, State2, State 3}; State state = State.State1;

(Да, это шутка. В основном.)

2 голосов
/ 30 мая 2011

Переключение с C / C ++, я полагаю?

Нет, не могу этого сделать

1 голос
/ 30 мая 2011

Нет, этого не существует.И при этом не очень читабельное ИМХО

0 голосов
/ 30 мая 2011

Нет, в C # объявление или тип и использование этого типа для объявления переменных являются отдельными.

В C / C ++ обычно объявляют и используют тип напрямую, например, с ключевым словом struct,В C # они являются отдельными.

Обратите внимание, что в C # вам не нужна точка с запятой после объявления enum (или class или struct):

enum State { State1, State2, State3 }

Это все еще разрешено, хотя, предположительно, быть немного более совместимым с синтаксисом C / C ++.

...