Czy wyliczenia w C # powinny mieć swój własny plik? [Zamknięte]


178

Mam klasę, która używa wyliczenia, wyliczenie jest obecnie w swoim własnym pliku, co wydaje się marnotrawstwem.

Jaka jest ogólna opinia na temat wyliczeń umieszczanych w przestrzeni nazw pliku, w którym są używane? A może wyliczenie powinno naprawdę znajdować się we własnym pliku cs?

Edytować

Powinienem wspomnieć, że podczas gdy omawiana klasa używa tych wyliczeń, tak samo robią dzwoniący zewnętrzni. Innymi słowy, inna klasa może ustawić te wyliczenia. Więc nie są używane wewnętrznie w klasie, w przeciwnym razie to pytanie byłoby oczywiste.


86
Gdybyś użył magicznych liczb, nie miałbyś tego problemu.
MusiGenesis

7
Czy to powinna być wiki społeczności? Nie ma poprawnej odpowiedzi ani rzeczywistych technicznych uwarunkowań poza możliwościami IDE.
Jeff Sternal

1
Nadal mogą znajdować się w tej samej przestrzeni nazw, nawet jeśli znajdują się w różnych plikach. Jeśli zadajesz drugorzędne pytanie, czy utworzyć przestrzeń nazw .Enums ORAZ nowy plik, to zwykle odpowiadam, że nie. Ale w przeciwnym razie możesz źle rozumieć przestrzenie nazw i przeczytać o nich - (niewiele dla nich, tylko mechanizm organizacji)
Jason Kleban

1
Zadeklarowanie wyliczenia we własnym pliku pozwala programiście na łatwe zlokalizowanie wyliczenia za pomocą okna poleceń (> z [nazwa wyliczenia])
Riju,

Odpowiedzi:


103

Nie powiedziałbym „marnotrawstwa” (ile kosztuje dodatkowy plik?), Ale często jest to niewygodne. Zwykle jest jedna klasa, która jest najbliżej powiązana z wyliczeniem i umieszczam je w tym samym pliku.


7
Dodaje szum do katalogu podczas przeglądania, to właśnie miałem na myśli przez marnotrawstwo.
Finglas

117
@Finglas - hałas jednej osoby to sygnał drugiej osoby!
Jeff Sternal,

6
Zwykle istnieje jedna klasa, która jest najbardziej powiązana. Ale jeśli to się zmieni, jeśli ktoś pojawi się na raz, zdecyduje się wziąć zależność od wyliczenia, to czas na refaktor.
Brennan Pope

2
Jeśli wyliczenie ma być współużytkowane przez różne klasy, lepiej umieścić je w osobnym pliku.
Konrad

76

To naprawdę tylko kwestia preferencji.

Wolę umieścić każde wyliczenie w osobnym pliku (podobnie dla każdego interfejsu, klasy i struktury, nieważne jak małe). Dzięki temu łatwiej je znaleźć, gdy przechodzę z innego rozwiązania lub w inny sposób nie mam jeszcze odniesienia do danego typu.

Umieszczenie jednego typu w każdym pliku ułatwia również identyfikację zmian w systemach kontroli źródła bez różnicowania.


10
„Umieszczenie jednego typu w każdym pliku ułatwia również identyfikację zmian w systemach kontroli źródła bez różnic”. Strach przed różnicami nie powinien stanowić podstawy decyzji projektowych. Twierdziłbym nawet, że każdy, kto nie wie, jak poprawnie porównać plik w kontroli źródła, tak naprawdę wcale nie używa kontroli źródła.
Dan Bechard

59

To całkowicie kwestia stylu. Zwykle mam plik o nazwieEnums.cs w rozwiązaniu, w którym są zbierane deklaracje wyliczeniowe.

Ale i tak zwykle można je znaleźć za pomocą F12klucza.


4
Myślę, że jest to prawdopodobnie najlepsza opcja, ponieważ: 1) to tylko jeden plik zamiast wielu, co można uznać za zaśmiecanie katalogu 2) jest jasne, co jest zawarte w pliku 3) oznacza, że ​​wiesz, gdzie znaleźć enumzamiast jest w pliku zawierającym klasę, która jest powiązana, ale niekoniecznie jedyna klasa, która go używa
dav_i

6
Absolutnie tego nie lubię. Jak powiedziano w odpowiedzi Jamesa Currana, wyliczenia mają głównie związek z klasami. Umieszczając je wszystkie w jednym pliku globalnym, nie ma ich już nawet w katalogu (dla podprzestrzeni nazw), do którego mogłyby należeć tematycznie.
Ray

3
Tak @DebugErr, zgadzam się z tobą. Odkąd ta odpowiedź została opublikowana w 2010 r., Zmieniłem różne podejścia i zwykle używam jednego pliku na typ lub deklaruję wyliczenia w tym samym pliku, co powiązana klasa.
Fredrik Mörk

@Ray ...enums have a relation to classes mostly.. Tutaj mnie straciłeś. Proszę podać przykład, jak poradziłbyś sobie z wyliczeniami, które mają relacje z kilkoma klasami?
K - Toksyczność SO rośnie.

@KarlMorrison Proszę, ten komentarz ma 5 lat. W każdym razie nie bez powodu dodałem słowo „głównie”. Wyliczenia mają związek nie tylko z klasami, ale również z przestrzeniami nazw. Gdybym miał AnchorStylewyliczenie używane w całej bibliotece interfejsu użytkownika, zazwyczaj miałbym również podprzestrzeń nazw interfejsu użytkownika i odpowiedni folder. Następnie umieściłbym go w AnchorStyle.cspliku w folderze UI, gdzie mogę go łatwo znaleźć, a nie w pliku o ogólnej nazwie „Enums.cs”.
Ray

47

Pytanie, które należy sobie zadać, brzmi: czy jest coś na temat typu wyliczenia w C #, co wskazuje, że powinienem traktować go inaczej niż wszystkie inne typy, które tworzę?

Jeśli wyliczenie jest publiczne, powinno być traktowane jak każdy inny typ publiczny. Jeśli jest prywatny, zadeklaruj go jako zagnieżdżonego członka klasy, która go używa. Nie ma żadnego ważnego powodu, aby umieszczać dwa typy publiczne w tym samym pliku tylko dlatego, że jeden jest wyliczeniem. Liczy się tylko fakt, że jest to typ publiczny; smak typu nie.


A co, jeśli chcesz ponownie użyć wyliczeń w innym rozwiązaniu tego samego projektu korporacyjnego? Powiązanie wyliczeń z klasami używającymi go byłoby bardzo trudne do ponownego użycia.
mko

@mko: Odwołanie do projektu już oznacza, że ​​klasa i wyliczenie będą dostępne dla innego rozwiązania. Co by to utrudniło?
Bryan Watts

Jasne, ale czy naprawdę chcesz dzielić całą klasę z jej logiką, jeśli chcesz używać tylko wyliczeń. Co więcej, co się stanie, jeśli różne klasy mają to samo wyliczenie. Gdzie byś to umieścił?
mko

@mko: Z odniesieniem do projektu otrzymasz oba typy, niezależnie od tego, czy znajdują się w różnych plikach, czy nie. Mam problem ze zrozumieniem, o co pytasz.
Bryan Watts

Cóż, ja nie mówię o odniesieniach do projektu. Mówię o przenoszeniu wyliczeń do współdzielonego pliku projektu i możliwości ponownego użycia go w wielu projektach bez ujawniania całych klas. Mówisz: „Nie ma ważnego powodu, aby umieszczać dwa typy publiczne w tym samym pliku, tylko dlatego, że jeden jest wyliczeniem”. Może jest powód, aby umieścić wszystkie wyliczenia w tym samym pliku, jeśli zastosujesz się do mojego wyjaśnienia.
MKO

24

Kolejną zaletą umieszczania każdego typu (klasy, struktury, wyliczenia) we własnym pliku jest kontrola źródła. Możesz łatwo uzyskać całą historię typu.


18

Umieszczam głównie w przestrzeni nazw i poza klasą, aby były łatwo dostępne inne klasy w tej przestrzeni nazw, jak poniżej.

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

Łał. Nie wiedziałem, że wyliczenia można umieszczać bezpośrednio w przestrzeni nazw. Idę z tą odpowiedzią. W mojej strukturze MVC zostaną umieszczone wewnątrz kontrolera, co tworzy dla mnie logikę. Dzięki za to. Głosowano za.
C4d

11

Generalnie wolę, aby moje wyliczenia znajdowały się w tym samym pliku, co klasa, której najprawdopodobniej będzie atrybutem. Jeśli na przykład mam klasę, Taskwyliczenie TaskStatusbędzie w tym samym pliku.

Jeśli jednak mam wyliczenia o bardziej ogólnym charakterze, przechowuję je kontekstowo w różnych plikach.


A co, jeśli inna klasa również używa tego samego wyliczenia?
mko

2
@mko - Dlatego powiedziałem (w 2010 roku, kiedy to odpowiedziałem), że jeśli wyliczenia mają bardziej ogólny charakter, przechowuję je w osobnych plikach. W kontekście kontekstowym miałem na myśli, że w niektórych przypadkach niektóre wyliczenia mogą znajdować się w oddzielnym pliku, aw innych przypadkach mogę zgrupować zestaw deklaracji wyliczeń w jednym pliku.
Nikos Steiakakis

10

To zależy od tego, jaki dostęp jest potrzebny.

Jeśli wyliczenie jest używane tylko przez jedną klasę, można zadeklarować je w tej klasie, ponieważ nie ma potrzeby używania go nigdzie indziej.

W przypadku wyliczeń używanych przez wiele klas lub w publicznym interfejsie API zawsze będę przechowywać definicję we własnym pliku w odpowiedniej przestrzeni nazw. O wiele łatwiej jest znaleźć ten sposób, a strategia opiera się na schemacie jednego obiektu na plik, który jest dobry do użycia również z klasami i interfejsami.


8

Myślę, że to zależy od zakresu wyliczenia. Na przykład, jeśli wyliczenie jest specyficzne dla jednej klasy, na przykład używane w celu uniknięcia scenariusza magicznej stałej, to powiedziałbym, że umieść je w tym samym pliku co klasa:

enum SearchType { Forward, Reverse }

Jeśli wyliczenie jest ogólne i może być używane przez kilka klas w różnych scenariuszach, byłbym skłonny użyć umieszczenia go we własnym pliku. Na przykład poniższe mogą być użyte do kilku celów:

enum Result { Success, Error }

6

Zwykle umieszczam wyliczenia w ich własnym pliku z bardzo prostego powodu: tak jak w przypadku klas i struktur, dobrze jest wiedzieć dokładnie gdzie szukać, jeśli chcesz znaleźć definicję typu: w pliku o tej samej nazwie. (Aby być uczciwym, w VS zawsze możesz też użyć opcji „Przejdź do definicji”).

Oczywiście może wymknąć się spod kontroli. Kolega, u którego pracuję, nawet tworzy osobne pliki dla delegatów.


6

Jedną z zalet używania oddzielnego pliku dla wyliczeń jest to, że można usunąć oryginalną klasę, która używała wyliczenia, i napisać nową klasę przy użyciu wyliczenia.

Jeśli wyliczenie jest niezależne od oryginalnej klasy, umieszczenie go w oddzielnym pliku ułatwi przyszłe zmiany.


6

Jeśli używasz dodatku USysWare File Browser dla programu Visual Studio, możesz bardzo szybko znaleźć pliki o określonych nazwach w swoim rozwiązaniu. Wyobraź sobie, że szukasz wyliczenia, które nie znajduje się we własnym pliku, ale zamiast tego jest zakopane w jakimś pliku w gigantycznym rozwiązaniu.

W przypadku małych rozwiązań nie ma to znaczenia, ale w przypadku dużych coraz ważniejsze staje się przechowywanie klas i wyliczeń w ich własnych plikach. Możesz je szybko znaleźć, edytować i nie tylko. Bardzo, bardzo polecam umieszczenie twojego wyliczenia w jego własnym pliku.

I jak już zostało powiedziane ... Jak marnotrawstwem jest plik, który i tak kończy się tylko kilkoma KB?


Używam również tego dodatku, jest całkiem przydatny. Umieściłbym wyliczenia w ich własnym pliku, bez względu na to, czy rozwiązanie jest duże, czy małe.
Rui Jarimba

5

Bardzo prosta, ogromna zaleta oddzielenia pliku. Kiedy jakikolwiek obiekt znajduje się we własnym pliku MyObjectName.cs ... możesz przejść do eksploratora rozwiązań i wpisać MyObjectName.cs i wyświetlić dokładnie 1 plik. Wszystko, co poprawia debugowanie, jest fajne.

Kolejna zaleta z podobnej notatki, jeśli przeszukasz wszystkie pliki ( ctrl+ shft+ F) pod kątem nazwy, możesz znaleźć 20 odniesień do nazwy w tym samym pliku ... i ta znaleziona nazwa będzie częścią różnych obiektów. W oknie Znajdź wyniki wszystko, co możesz zobaczyć, to numer linii i nazwa pliku. Musiałbyś otworzyć plik i przewinąć, aby dowiedzieć się, w którym obiekcie znajduje się znalezione odniesienie.

Podoba mi się wszystko, co ułatwia debugowanie.


3

Jeśli masz wiele projektów w jednym rozwiązaniu. Wtedy lepiej stwórz kolejny projekt Utilities. Następnie utwórz folder \Enumerationsi utwórz zagnieżdżony plik static class. Następnie przypisz każdą klasę statyczną, w której utworzysz wyliczenie odpowiadające nazwom Twoich projektów. Na przykład masz projekt o nazwie DatabaseReader i DatabaseUsers, a następnie możesz nazwać klasę statyczną, taką jak

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

}

Następnie całe wyliczenie, które można wykorzystać w całych rozwiązaniach na projekty, zostanie na nim zadeklarowane. Użyj #, regionaby oddzielić każdy problem. Dzięki temu łatwiej jest szukać wyliczeń


1

Lubię mieć jeden publiczny plik wyliczeń o nazwie E, zawierający każde oddzielne wyliczenie, a następnie można uzyskać dostęp do dowolnego wyliczenia za pomocą E ... i można nimi zarządzać w jednym miejscu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.