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


178

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

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

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

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


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
    {
        ...
    }
}

Вот это да. Я не знал, что перечисления могут быть помещены непосредственно в пространство имен. Я иду с этим ответом. Внутри моей структуры 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, который находится не в своем собственном файле, а вместо этого похоронен в каком-то файле в гигантском решении.

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

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


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

5

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

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

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


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 ... и они находятся в одном месте для управления.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.