Чи повинні переписки у C # мати власний файл? [зачинено]


178

У мене клас, який використовує перерахування, перелік наразі є у власному файлі, який здається марним.

Яка загальна думка щодо розміщення переліків у просторі імен файлу, в якому вони вживаються? Чи повинен переслідувати дійсно власний файл cs?

Редагувати

Я мушу зазначити, що, хоча відповідний клас використовує ці перерахування, це робить і зовнішні дзвінки. Іншими словами, інший клас може встановити ці перерахування. Таким чином, вони не використовуються всередині класу, інакше це запитання не може спричинити.


86
Якби ви використовували магічні числа, у вас взагалі не виникне ця проблема.
MusiGenesis

7
Це має бути вікі спільноти? Немає правильної відповіді та реальних технічних міркувань, окрім можливостей IDE.
Jeff Sternal

1
Вони все ще можуть бути в одному просторі імен, навіть якщо вони знаходяться в різних файлах. Якщо ви задаєте вторинне питання про те, чи потрібно створити простір імен .Enums І новий файл, я б сказав, як правило, ні. Але в іншому випадку ви можете неправильно зрозуміти простори імен, і вам слід прочитати про них - (не надто багато, просто механізм організації)
Джейсон Клебан

1
Оголошення enum у власному файлі дозволяє програмісту легко знаходити enum за допомогою командного вікна (> of [enum Name])
Riju

Відповіді:


103

Я б не сказав "марнотратний" (скільки коштує додатковий файл?), Але це часто неприємно. Зазвичай є один клас, який найбільше асоціюється з перерахунком, і я поміщую їх у один і той же файл.


7
Він додає шум до каталогу під час перегляду, ось що я мав на увазі під марнотратством.
Finglas

117
@Finglas - шум однієї людини - сигнал іншої людини!
Jeff Sternal

6
Зазвичай є один клас, який найбільш тісно пов'язаний. Але якщо це зміниться, якщо хтось прийде разом, вирішив взяти залежність від перерахунку, то настав час для рефактора.
Brennan Pope

2
Якщо перерахунок потрібно розділити між різними класами, то краще розмістити його в окремому файлі.
Конрад

76

Це справді лише питання переваги.

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

Введення одного типу у кожен файл також полегшує ідентифікацію змін у системах управління джерелами, не змінюючи їх.


10
"Введення одного типу у кожен файл також полегшує ідентифікацію змін у системах управління джерелами, не змінюючи їх." Страх перед різницею не повинен бути основою ваших дизайнерських рішень. Я б навіть заперечував, що той, хто не знає, як правильно відрізняти файл у керуванні джерелом, насправді взагалі не використовує керування джерелом.
Dan Bechard

59

Це цілком питання стилю. Те, що я схильний робити, - це файл, який називається Enums.csв рішенні, в якому збираються декларації перерахунків.

Але вони, як правило, знаходяться через F12ключ все одно.


4
Я думаю, що це, мабуть, найкращий варіант, оскільки він: 1) є лише один файл замість багатьох, який може розглядатися як захаращування каталогу 2) зрозуміло, що міститься у файлі 3) означає, що ви знаєте, де знайти enumзамість він знаходиться у файлі, що містить клас, який пов'язаний, але не обов'язково єдиний клас, який використовує його
dav_i

6
Мені це абсолютно не подобається. Як сказано у відповіді Джеймса Куррана, енуми мають відношення переважно до класів. Якщо їх розмістити в одному глобальному файлі, вони вже навіть не знаходяться в каталозі (для простору імен), де вони могли б тематично належати.
Рей

3
Так @DebugErr, я з вами згоден. Оскільки ця відповідь була опублікована ще в 2010 році, я змінювався між різними підходами і, як правило, йшов по одному файлу на тип, або оголошував перерахунки в тому ж файлі, що і відповідний клас.
Фредрік Морк

@Ray ...enums have a relation to classes mostly.. Тут ти мене загубив. Наведіть, будь ласка, приклад того, як би ви поводилися з енумами, які мають стосунки до кількох класів?
K - Токсичність в SO зростає.

@KarlMorrison Будь ласка, цього коментаря 5 років. У всякому разі, я додав слово "переважно" з причини. Енуми мають відношення до більш ніж просто класів, як і просторів імен. Якби у мене була AnchorStyleперерахунок, який використовується у всій бібліотеці інтерфейсу, я б також мав підпростір імен UI та відповідну папку. Потім я розміщую його у AnchorStyle.csфайлі в папці інтерфейсу, де я можу його легко знайти, а не у загальновідомому файлі "Enums.cs".
Рей

47

Питання, яке слід задати собі, було б: чи є щось про тип перерахування в C #, що вказує на те, що я повинен ставитися до нього по-різному від усіх інших типів, які я створюю?

Якщо перерахування є загальнодоступним, до нього слід ставитися як до будь-якого іншого публічного типу. Якщо він приватний, оголосьте його як вкладений член класу, використовуючи його. Немає вагомих причин розміщувати два загальнодоступні типи в одному файлі просто тому, що один є перерахуванням. Те, що це публічний тип - це все, що має значення; аромат типу не має.


Що робити, якщо ви хочете повторно використовувати переписувачів в іншому рішенні одного й того ж проекту підприємства? Зв'язування переліків з класом, використовуючи його, було б дуже важко повторно використовувати його.
mko

@mko: Посилання на проект вже означає, що і клас, і enum будуть доступні для іншого рішення. Що б ускладнило це?
Брайан Уоттс

Звичайно, але ви дійсно хочете поділитися цілим класом з його логікою, якщо ви хочете використовувати лише переліки. Більше того, що робити, якщо різні класи мають одне і те ж перерахування. Де б ви його розмістили?
mko

@mko: Посилаючись на проект, ви отримаєте обидва типи, чи є вони в різних файлах чи ні. У мене виникають труднощі з'ясувати, що ви просите.
Брайан Воттс

Ну, я не говорю про посилання на проект. Я говорю про переміщення переліків до спільного файлу проекту і мати можливість його повторного використання в декількох проектах, не виставляючи цілих класів. Ви говорите: "Немає вагомих причин розміщувати два загальнодоступні типи в одному файлі просто тому, що один - це перерахування". Можливо, є причина розмістити всі перерахунки в одному файлі, якщо ви будете слідувати моїм поясненням.
mko

24

Ще одна перевага розміщення кожного типу (клас, структура, enum) у власному файлі - це управління джерелами. Ви можете легко отримати всю історію типу.


18

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

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

Ого. У мене невідомі переліки можуть бути розміщені безпосередньо в просторі імен. Я йду з цією відповіддю. Всередині моєї структури MVC вони будуть розміщені всередині контролера, що робить для мене логікою. Дякую за це Отримано.
C4d

11

Як правило, я вважаю за краще, щоб мої переліки були у тому ж файлі, що і клас, до якого, швидше за все, це буде атрибут. Якщо, наприклад, у мене є клас, Taskто enum TaskStatusбуде в одному файлі.

Однак якщо у мене є переліки більш загального характеру, то я зберігаю їх контекстуально у різних файлах.


Що робити, якщо різні класи також використовують один і той же перелік?
mko

2
@mko - тому я сказав (ще в 2010 році, коли я відповів на це), що якщо переліки мають більш загальний характер, я зберігаю їх в окремих файлах. Контекстуально я мав на увазі, що в деяких випадках деякі перерахунки можуть бути в окремому файлі, а в інших випадках я можу згрупувати набір декларацій перерахунків в одному файлі.
Нікос Стеякакіс

10

Це залежить від того, який доступ потрібен.

Якщо enum використовується лише одним класом, то добре оголосити його в межах цього класу, тому що вам не потрібно використовувати його більше ніде.

Для переліків, які використовуються у декількох класах або у відкритому API, я завжди зберігатиму визначення у власному файлі у відповідному просторі імен. Це набагато простіше знайти такий спосіб, і стратегія слідує шаблону один об'єкт на файл, який також добре використовувати з класами та інтерфейсами.


8

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

enum SearchType { Forward, Reverse }

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

enum Result { Success, Error }

6

Я схильний містити переписки у власному файлі з дуже простої причини: як і у класах і структурах, приємно точно знати , де шукати, якщо ви хочете знайти визначення типу: у однойменному файлі. (Для справедливості, у VS ви завжди можете також використовувати "Перейти до визначення".)

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


6

Однією з переваг використання окремого файлу для переліків є те, що ви можете видалити початковий клас, який використовував enum, і написати новий клас за допомогою enum.

Якщо enum не залежить від початкового класу, то розміщення його в окремому файлі спрощує майбутні зміни.


6

Якщо ви використовуєте надбудову файлового браузера USysWare для Visual Studio, ви можете дуже швидко знайти файли конкретних імен у своєму рішенні. Уявіть, що ви шукаєте перерахунку, який знаходиться не у власному файлі, а замість цього закопаний у якийсь файл у гігантському рішенні.

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

І як було зазначено ... Наскільки марнотратним є файл, який у будь-якому разі становить лише пару кілоб?


Я також використовую цю надбудову, це дуже зручно. Я б розмістив переліки у власному файлі, незалежно від того, рішення велике чи мало.
Rui Jarimba

5

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

Ще одна перевага подібної примітки, якщо ви шукаєте ім’я у всіх файлах ( ctrl+ shft+ F), ви можете знайти 20 посилань на це ім’я в одному файлі ... і це знайдене ім’я буде частиною різних об'єктів. У вікні "Результати пошуку" ви можете побачити лише номер рядка та ім'я файлу. Вам потрібно було б відкрити файл і прокрутити, щоб з’ясувати, в якому об’єкті було знайдено посилання.

Мені подобається все, що полегшує налагодження.


3

Якщо у вас є кілька проектів за одне рішення. Тоді краще створити ще один проект 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щоб розділити кожну проблему. Цим легше шукати будь-які перерахунки


1

Мені подобається мати один загальнодоступний файл enums з назвою E, що містить кожен окремий перелік, то будь-який перелік може бути доступний за допомогою E ... і вони знаходяться в одному місці для управління.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.