Определить перечисления в методе в С#?
У меня есть в основном фон С++, и я изучаю С#. Итак, мне нужна помощь с идиомами и стилями С#.
Я пытаюсь написать в С# небольшой метод разбора текстовых файлов, в котором мне нужна простая переменная состояния с тремя состояниями. В С++ я бы объявил enum
как это для переменной состояния:
enum { stHeader, stBody, stFooter} state = stBody;
... и затем используйте его в моем синтаксическом цикле следующим образом:
if (state == stHeader && input == ".endheader")
{
state = stBody;
}
В С# я понимаю, что невозможно объявить enum
внутри метода. Итак, что я должен делать ради чистого стиля? Объявить этот внутренний enum
вне метода? Использовать магические числа 1,2,3? Создайте для этого отдельный класс?
Пожалуйста, помогите мне разобраться в моей путанице.
Ответы
Ответ 1
Ближайшим, который вы можете получить, является частное вложенное перечисление в классе:
public class TheClass
{
private enum TheEnum
{
stHeader,
stBody,
stFooter
}
// ...the rest of the methods properties etc...
}
Ответ 2
Вы также можете использовать постоянные переменные, но я предпочитаю, и я считаю, что лучше использовать стиль кода для использования
Перечисления
public class Class1
{
private enum TheEnum
{
stHeader,
stBody,
stFooter
}
public void SomeMethodEnum()
{
TheEnum state = TheEnum.stBody;
switch (state)
{
case TheEnum.stHeader:
//do something
break;
case TheEnum.stBody:
break;
case TheEnum.stFooter:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
public void SomeMethodConst()
{
int state = 1;
const int Header = 1;
const int Body = 2;
const int Footer = 3;
switch (state)
{
case Header:
break;
case Body:
break;
case Footer:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
Ответ 3
Я также одобряю подход Enum. Кроме того, хотя это не так, у этого есть преимущества перед CONSTS, когда вы хотите объединить их в качестве флагов, так как у вас есть способ, чтобы легко проверить это.