Подтвердить что ты не робот

Определить перечисления в методе в С#?

У меня есть в основном фон С++, и я изучаю С#. Итак, мне нужна помощь с идиомами и стилями С#.

Я пытаюсь написать в С# небольшой метод разбора текстовых файлов, в котором мне нужна простая переменная состояния с тремя состояниями. В С++ я бы объявил enum как это для переменной состояния:

enum { stHeader, stBody, stFooter} state = stBody;

... и затем используйте его в моем синтаксическом цикле следующим образом:

if (state == stHeader && input == ".endheader")
{
  state = stBody;
}

В С# я понимаю, что невозможно объявить enum внутри метода. Итак, что я должен делать ради чистого стиля? Объявить этот внутренний enum вне метода? Использовать магические числа 1,2,3? Создайте для этого отдельный класс?

Пожалуйста, помогите мне разобраться в моей путанице.

4b9b3361

Ответ 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, когда вы хотите объединить их в качестве флагов, так как у вас есть способ, чтобы легко проверить это.