Должны ли перечисления в C # иметь свой собственный файл? [закрыто]

178

У меня есть класс, который использует перечисление, перечисление в настоящее время находится в своем собственном файле, который кажется расточительным.

Каково общее мнение о перечислениях, помещаемых в пространство имен файла, в котором они используются? Или перечисление должно действительно жить в своем собственном файле cs?

редактировать

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

Finglas
источник
87
Если бы вы использовали магические числа, у вас не было бы этой проблемы вообще.
MusiGenesis
7
Это должно быть сообщество вики? Там нет правильного ответа и никаких реальных технических соображений, кроме возможностей IDE.
Джефф Стерн
1
Они все еще могут находиться в одном и том же пространстве имен, даже если они находятся в разных файлах. Если вы задаете второстепенный вопрос о том, создавать ли пространство имен .Enums И новый файл, то я бы сказал, обычно нет. Но в противном случае у вас может быть неправильное понимание пространств имен, и вы должны прочитать о них - (не очень, просто организационный механизм)
Джейсон Клебан
1
Объявление enum в своем собственном файле позволяет программисту легко находить enum с помощью командного окна (> of [enum Name])
Riju

Ответы:

103

Я бы не сказал «расточительно» (сколько стоит дополнительный файл?), Но это часто неудобно. Обычно есть один класс, который наиболее тесно связан с enum, и я помещаю их в один файл.

Джеймс Керран
источник
7
Это добавляет шум в каталог при просмотре, это то, что я имел в виду под расточительным.
Finglas
118
@Finglas - шум одного человека - это сигнал другого человека!
Джефф Стерн
6
Обычно есть один класс, который наиболее тесно связан. Но если это изменится, если кто-то придет и решит взять зависимость от перечисления, тогда пришло время для рефакторинга.
Папа Бреннан
2
Если перечисление должно быть общим для разных классов, предпочтительно поместить его в отдельный файл.
Конрад
76

Это действительно просто вопрос предпочтений.

Я предпочитаю помещать каждое перечисление в отдельный файл (аналогично для каждого интерфейса, класса и структуры, независимо от их размера). Их легче найти, когда я прихожу из другого решения или у меня нет ссылки на данный тип.

Размещение одного типа в каждом файле также облегчает выявление изменений в системах контроля версий без различий.

оборота Джефф Стерн
источник
10
«Размещение одного типа в каждом файле также облегчает выявление изменений в системах контроля версий без различий». Боязнь различий не должна лежать в основе ваших дизайнерских решений. Я бы даже поспорил, что любой, кто не знает, как правильно распознать файл в системе контроля версий, на самом деле вообще не использует систему контроля версий.
Дэн Бешард
59

Это полностью вопрос стиля. Я склоняюсь к тому, чтобы Enums.csв решении был вызван файл, в котором собраны объявления enum.

Но они, как правило, обнаруживаются через F12ключ в любом случае.

Фредрик Мёрк
источник
4
Я думаю, что это, вероятно, лучший вариант, так как: 1) это только один файл вместо многих, который можно рассматривать как загромождение каталога 2) понятно, что содержится в файле 3) означает, что вы знаете, где найти enumвместо это находится в файле, содержащем класс, который связан, но не обязательно единственный класс, использующий его
dav_i
6
Мне это абсолютно не нравится. Как сказано в ответе Джеймса Керрана, перечисления в основном имеют отношение к классам. Помещая их все в один глобальный файл, они больше не находятся в каталоге (для подпространства имен), где они могут тематически принадлежать.
Рэй
3
Да @ DebugErr, я с тобой согласен. С тех пор как этот ответ был опубликован еще в 2010 году, я переключался между различными подходами и стараюсь использовать один файл для каждого типа или объявлять перечисления в том же файле, что и связанный класс.
Фредрик Мёрк
@Ray ...enums have a relation to classes mostly.. Это где ты потерял меня. Пожалуйста, приведите пример того, как вы будете обрабатывать перечисления, имеющие отношение к нескольким классам?
К - Токсичность в СО растет.
@KarlMorrison Пожалуйста, этому комментарию 5 лет. Во всяком случае, я добавил слово «в основном» по причине. Перечисления имеют отношение не только к классам, но и к пространствам имен. Если бы я использовал AnchorStyleenum во всей библиотеке UI, у меня также обычно было бы подпространство имен UI и соответствующая папка. Затем я поместил бы его в AnchorStyle.csфайл в папке пользовательского интерфейса, где я мог бы легко найти его, а не в файле с общим названием «Enums.cs».
Рэй
47

Вопрос, который вы должны задать себе, был бы: есть ли что-нибудь о типе перечисления в C #, который указывает, что я должен относиться к нему иначе, чем все другие типы, которые я создаю?

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

Брайан Уоттс
источник
А что если вы хотите повторно использовать перечисления в другом решении того же корпоративного проекта? Связывание перечислений с использованием класса будет очень сложным для повторного использования.
Mko
@mko: ссылка на проект уже означает, что и класс, и enum будут доступны для другого решения. Что бы это затруднило?
Брайан Уоттс
Конечно, но вы действительно хотите поделиться всем классом с его логикой, если вы хотите использовать только перечисления. Более того, что если разные классы имеют одинаковое перечисление. Где бы вы это разместили?
Mko
@mko: со ссылкой на проект вы получите оба типа, независимо от того, находятся они в разных файлах или нет. У меня проблемы с выяснением того, что вы спрашиваете.
Брайан Уоттс
Ну, я не говорю о проекте, вы. Я говорю о перемещении перечислений в общий файл проекта и возможности его повторного использования в нескольких проектах без раскрытия целых классов. Вы говорите: «Нет веской причины помещать два открытых типа в один файл просто потому, что один является перечислением». Может быть, есть причина поместить все перечисления в один файл, если вы следуете моим объяснениям.
Mko
24

Еще одним преимуществом размещения каждого типа (class, struct, enum) в своем собственном файле является управление исходным кодом. Вы можете легко получить всю историю типа.

Томми Карлир
источник
18

Я размещаю в основном внутри пространства имен и вне класса, чтобы он был легко доступен другим классам в этом пространстве имен, как показано ниже.

namespace UserManagement
{
    public enum UserStatus { Active, InActive }
    class User
    {
        ...
    }
}
Adeel
источник
Вот это да. Я не знал, что перечисления могут быть помещены непосредственно в пространство имен. Я иду с этим ответом. Внутри моей структуры MVC они будут размещены внутри контроллера, что делает мне логику. Спасибо за это. Upvoted.
C4d
11

Обычно я предпочитаю, чтобы мои перечисления были в том же файле, что и класс, к которому они, скорее всего, будут принадлежать. Если, например, у меня есть класс, Taskперечисление TaskStatusбудет в том же файле.

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

Никос Стеякакис
источник
Что если другой класс также использует один и тот же enum?
Mko
2
@mko - Вот почему я сказал (еще в 2010 году, когда ответил на это), что если перечисления имеют более общий характер, я храню их в отдельных файлах. Под контекстом я имел в виду, что в некоторых случаях некоторые перечисления могут быть в отдельном файле, а в других случаях я могу сгруппировать набор объявлений перечислений в один файл.
Никос Стейакакис
10

Это зависит от того, какой доступ необходим.

Если перечисление используется только одним классом, можно объявить его в этом классе, потому что вам не нужно его использовать где-либо еще.

Для перечислений, используемых несколькими классами или в общедоступном API, я всегда буду хранить определение в своем собственном файле в соответствующем пространстве имен. Его гораздо проще найти, и стратегия следует шаблону «один объект на файл», который также хорошо подходит для классов и интерфейсов.

Джон Зигель
источник
8

Я думаю, что это зависит от объема перечисления. Например, если перечисление относится к одному классу, например, используется, чтобы избежать сценария магической константы, то я бы сказал, поместите его в тот же файл, что и класс:

enum SearchType { Forward, Reverse }

Если перечисление является общим и может использоваться несколькими классами для различных сценариев, то я бы склонен использовать его в своем собственном файле. Например, приведенное ниже может быть использовано для нескольких целей:

enum Result { Success, Error }
Вишал Мистри
источник
6

Я склонен помещать перечисления в их собственный файл по очень простой причине: как и с классами и структурами, приятно точно знать , где искать, если вы хотите найти определение типа: в файле с тем же именем. (Если честно, в VS вы всегда можете использовать «Перейти к определению»).

Очевидно, это может выйти из-под контроля. Коллега, где я работаю, даже делает отдельные файлы для делегатов.

Дэн Тао
источник
6

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

Если enum не зависит от исходного класса, то размещение его в отдельном файле облегчает будущие изменения.

Дуг Фергюсон
источник
6

Если вы используете надстройку USysWare File Browser для Visual Studio, вы можете очень быстро найти файлы с определенными именами в своем решении. Представьте себе, что вы ищете enum, который находится не в своем собственном файле, а вместо этого похоронен в каком-то файле в гигантском решении.

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

И, как было сказано ... Насколько расточительным является файл, который в конечном итоге составляет всего пару килобайт?

Batalla
источник
Я также использую эту надстройку, это очень удобно. Я бы поместил перечисления в их собственный файл, независимо от того, будет ли решение большим или маленьким.
Руи Джаримба
5

Очень простое огромное преимущество для отдельного файла. Когда какой-либо объект находится в своем собственном файле MyObjectName.cs ... вы можете перейти в обозреватель решений и ввести MyObjectName.cs, и вам будет показан ровно 1 файл. Все, что делает отладку лучше, приятно.

Еще одно преимущество аналогичной заметки: если вы ищете все файлы ( ctrl+ shft+ F) по имени, вы можете найти 20 ссылок на имя в одном и том же файле ... и это найденное имя будет частью различных объектов. В окне Find Results все, что вы видите, это номер строки и имя файла. Вам придется открыть файл и прокрутить, чтобы выяснить, в каком объекте была найдена ссылка.

Все, что облегчает отладку, мне нравится.

vbp13
источник
3

Если у вас есть несколько проектов в одном решении. Тогда лучше создай еще один проект Utilities. Затем создайте папку \Enumerationsи создайте вложенную static class. А затем назначьте каждый статический класс, в котором вы будете создавать enum, который соответствует названию ваших проектов. Например, у вас есть проект с именем DatabaseReader и DatabaseUsers, тогда вы можете назвать статический класс как

public static class EnumUtility {
    #region --Database Readers Enum
    public static class EnumDBReader {
         public enum Actions { Create, Retrieve, Update, Delete}; 
    }
    #endregion

    #region --Database Users Enum
    public static class EnumDBUsers {
         public enum UserIdentity { user, admin }; 
    }
    #endregion

}

Тогда все перечисление, которое можно использовать во всех решениях по проектам, будет объявлено на нем. Используйте #, regionчтобы отделить каждую проблему. По этому легче искать любые перечисления

Израиль Окбина
источник
1

Мне нравится иметь один общедоступный файл перечислений с именем E, содержащий каждое отдельное перечисление, тогда любой enum может быть доступен с помощью E ... и они находятся в одном месте для управления.

Патрик Кафка
источник