Должны ли перечисления в С# иметь собственный файл?

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

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

Edit

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

Но они обычно встречаются с помощью клавиши F12.

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

namespace UserManagement
{
    public enum UserStatus { Active, InActive }
    class User
    {
        ...
    }
}

Ответ 7

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

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

Ответ 8

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

enum SearchType { Forward, Reverse }

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

enum Result { Success, Error }

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

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

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

Ответ 13

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

Ответ 14

Если в одном решении есть несколько проектов. Затем лучше создать другой проект Utilities. Затем создайте папку \Enumerations и создайте вложенный static class. И затем назначьте каждый статический класс, в котором вы создадите перечисление, соответствующее названию ваших проектов. Например, у вас есть проект с именем 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 для разделения каждой проблемы. Таким образом, легче искать любые перечисления