Определение перечислений вне тела класса, но внутри пространства имен - PullRequest
14 голосов
/ 19 сентября 2011

Сегодня я столкнулся с кодом, который выглядит следующим образом.

namespace Foo
{

    public enum Game{ High, Low};
    public enum Switch{On, Off};

    public class Bar()
    {
    // Blah
    }
}

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

Ответы [ 2 ]

24 голосов
/ 19 сентября 2011

Перечисления являются типами, как классы.Когда вы объявляете enum внутри класса, это просто вложенный тип.Вложенное перечисление просто скрывает другие перечисления с тем же именем, которые объявлены во внешних областях, но вы все равно можете ссылаться на скрытое перечисление через его полностью определенное имя (используя префикс пространства имен в вашем примере).

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

5 голосов
/ 19 сентября 2011

Если вы поместите перечисления в класс, вам нужно будет указывать имя класса каждый раз, когда вы используете его вне класса, например:

SomeLongClassName x = new SomeLongClassName(SomeLongClassName.Game.High, SomeLongClassName.Switch.On);

вместо:

SomeLongClassName x = new SomeLongClassName(Game.High, Switch.On);

Вы можете решить поместить перечисление в класс, если оно используется только этим классом, но такая изоляция работает только для классов. Если у вас есть перечисление, которое используется только одним методом, вы не можете поместить его в метод.

...