Haruskah enums di C # memiliki file sendiri? [Tutup]

178

Saya memiliki kelas yang menggunakan enumerasi, enum saat ini dalam file sendiri yang tampaknya boros.

Apa pendapat umum tentang enum yang ditempatkan di dalam namespace dari file yang mereka konsumsi? Atau haruskah enum benar-benar hidup dalam file cs sendiri?

Edit

Saya harus menyebutkan bahwa sementara kelas yang bersangkutan menggunakan enumerasi ini, demikian juga penelepon eksternal. Dengan kata lain, kelas lain dapat mengatur enumerasi ini. Jadi mereka tidak digunakan secara internal ke kelas, kalau tidak pertanyaan ini akan menjadi tidak punya otak.

Finglas
sumber
86
Jika Anda menggunakan angka ajaib, Anda tidak akan memiliki masalah ini sama sekali.
MusiGenesis
7
Apakah ini wiki komunitas? Tidak ada jawaban yang benar dan tidak ada pertimbangan teknis yang nyata selain dari kemampuan IDE.
Jeff Sternal
1
Mereka masih bisa berada di namespace yang sama bahkan jika mereka berada di file yang berbeda. Jika Anda mengajukan pertanyaan sekunder apakah akan membuat .num namespace DAN file baru, maka saya akan mengatakan, biasanya, tidak. Tetapi jika tidak, Anda mungkin salah memahami ruang nama dan harus membacanya - (tidak banyak bagi mereka, hanya mekanisme organisasi)
Jason Kleban
1
Mendeklarasikan enum dalam file itu sendiri memungkinkan programmer untuk menemukan enum dengan mudah menggunakan jendela perintah (> dari [enum Nama])
Riju

Jawaban:

103

Saya tidak akan mengatakan "boros" (berapa biaya file tambahan?), Tetapi sering tidak nyaman. Biasanya ada satu kelas yang paling dekat dengan enum, dan saya menempatkan mereka di file yang sama.

James Curran
sumber
7
Ini menambah noise ke direktori saat browsing, itu yang saya maksud dengan boros.
Finglas
117
@Finglas - kebisingan satu orang adalah sinyal orang lain!
Jeff Sternal
6
Biasanya ada satu kelas yang paling dekat hubungannya. Tetapi jika itu berubah, jika seseorang datang pada suatu waktu memutuskan untuk mengambil ketergantungan pada enum, maka sudah waktunya untuk refactor.
Paus Brennan
2
Jika enum akan dibagikan ke berbagai kelas yang berbeda, lebih baik meletakkannya di file yang terpisah.
Konrad
76

Ini benar-benar hanya masalah preferensi.

Saya lebih suka meletakkan setiap enumerasi dalam file sendiri (juga untuk setiap antarmuka, kelas, dan struct, tidak peduli seberapa kecil). Itu membuat mereka lebih mudah ditemukan ketika saya datang dari solusi lain atau sebaliknya belum memiliki referensi ke jenis yang dimaksud.

Menempatkan satu jenis di setiap file juga memudahkan mengidentifikasi perubahan dalam sistem kontrol sumber tanpa perbedaan.

Jeff Sternal
sumber
10
"Menempatkan satu jenis di setiap file juga membuatnya lebih mudah untuk mengidentifikasi perubahan dalam sistem kontrol sumber tanpa perbedaan." Ketakutan akan perbedaan seharusnya tidak membentuk dasar dari keputusan desain Anda. Saya bahkan berpendapat bahwa siapa pun yang tidak tahu cara benar diff file dalam kontrol sumber tidak benar-benar menggunakan kontrol sumber sama sekali.
Dan Bechard
59

Ini sepenuhnya masalah gaya. Apa yang saya cenderung lakukan adalah memiliki file yang disebut Enums.csdalam solusi di mana deklarasi enum dikumpulkan.

Tetapi mereka biasanya ditemukan melalui F12kunci.

Fredrik Mörk
sumber
4
Saya pikir ini mungkin pilihan terbaik karena: 1) hanya satu file daripada banyak yang dapat dianggap sebagai mengacaukan direktori 2) jelas apa yang terkandung dalam file 3) berarti Anda tahu di mana menemukan dan enumbukannya itu berada dalam file yang berisi kelas yang terkait tetapi tidak harus satu-satunya kelas yang menggunakannya
dav_i
6
Saya benar-benar tidak suka ini. Seperti yang dikatakan dalam jawaban James Curran, enum memiliki hubungan dengan kelas kebanyakan. Ketika menempatkan mereka semua dalam satu file global, mereka bahkan tidak ada dalam direktori (untuk sub-namespace) lagi di mana mereka bisa secara tematik.
Ray
3
Ya @ DebugErr, saya setuju dengan Anda. Karena jawaban ini diposting kembali pada tahun 2010 saya telah berubah antara berbagai pendekatan dan cenderung pergi dengan satu file per jenis, atau mendeklarasikan enum dalam file yang sama dengan kelas terkait.
Fredrik Mörk
@ Ray ...enums have a relation to classes mostly.. Di sinilah Anda kehilangan saya. Tolong beri contoh bagaimana Anda akan menangani enum yang memiliki hubungan dengan beberapa kelas?
K - Keracunan dalam SO tumbuh.
@KarlMorrison Tolong, komentar itu 5 tahun. Bagaimanapun, saya menambahkan kata "kebanyakan" karena suatu alasan. Enum memiliki hubungan dengan lebih dari sekadar kelas, seperti ruang nama juga. Jika saya menggunakan AnchorStyleenum di seluruh perpustakaan UI, saya biasanya juga memiliki sub namespace UI dan folder yang sesuai. Saya kemudian akan meletakkannya di AnchorStyle.csfile di folder UI di mana saya dapat dengan mudah menemukannya, bukan di file "Enums.cs".
Ray
47

Pertanyaan yang ingin Anda tanyakan kepada diri Anda adalah: apakah ada sesuatu tentang tipe enumerasi dalam C # yang menunjukkan saya harus memperlakukannya secara berbeda dari semua jenis lain yang saya buat?

Jika enumerasi bersifat publik, itu harus diperlakukan seperti jenis publik lainnya. Jika bersifat pribadi, nyatakan sebagai anggota kelas yang bersarang menggunakannya. Tidak ada alasan kuat untuk menempatkan dua tipe publik dalam file yang sama hanya karena satu adalah enumerasi. Fakta bahwa itu adalah tipe publik adalah yang terpenting; rasa jenis tidak.

Bryan Watts
sumber
Bagaimana jika Anda ingin menggunakan kembali enum dalam solusi berbeda dari proyek perusahaan yang sama? Mengikat enum dengan menggunakan kelas akan sangat sulit untuk menggunakannya kembali.
mko
@ mko: Referensi proyek sudah berarti kelas dan enum akan tersedia untuk solusi yang berbeda. Apa yang membuatnya sulit?
Bryan Watts
Tentu, tetapi apakah Anda benar-benar ingin berbagi seluruh kelas dengan logikanya jika Anda hanya ingin menggunakan enum. Selanjutnya bagaimana jika kelas yang berbeda berbagi enumerasi yang sama. Di mana Anda akan meletakkannya?
mko
@ mko: Dengan referensi proyek, Anda akan mendapatkan kedua jenis apakah mereka berada di file yang berbeda atau tidak. Saya mengalami kesulitan mencari tahu apa yang Anda minta.
Bryan Watts
Yah saya tidak berbicara tentang referensi proyek, Anda. Saya berbicara tentang memindahkan enum ke file proyek bersama dan dapat menggunakannya kembali dalam beberapa proyek tanpa mengekspos seluruh kelas. Anda mengatakan "Tidak ada alasan kuat untuk menempatkan dua tipe publik dalam file yang sama hanya karena satu adalah enumerasi". Mungkin ada alasan untuk meletakkan semua enum di file yang sama jika Anda mengikuti penjelasan saya.
mko
24

Keuntungan lain dari menempatkan setiap jenis (kelas, struct, enum) dalam file sendiri adalah kontrol sumber. Anda dapat dengan mudah mendapatkan seluruh riwayat jenis.

Tommy Carlier
sumber
18

Saya menempatkan sebagian besar di dalam namespace dan di luar kelas sehingga mudah diakses kelas lain di namespace seperti di bawah ini.

namespace UserManagement
{
    public enum UserStatus { Active, InActive }
    class User
    {
        ...
    }
}
Adeel
sumber
Wow. Saya tidak tahu enum dapat ditempatkan ke namespace secara langsung. Saya akan menjawab ini. Di dalam MVC struct saya, mereka akan ditempatkan di dalam controller yang membuat logika bagi saya. Terima kasih untuk ini. Terpilih.
C4d
11

Secara umum saya lebih suka enums saya berada dalam file yang sama dengan Kelas yang kemungkinan besar akan menjadi atribut. Jika misalnya saya memiliki kelas Taskmaka enum TaskStatusakan berada di file yang sama.

Namun, jika saya memiliki enum yang lebih umum, maka saya menyimpannya secara kontekstual di berbagai file.

Nikos Steiakakis
sumber
Bagaimana jika kelas yang berbeda juga menggunakan enum yang sama?
mko
2
@ mko - Itu sebabnya saya katakan (kembali tahun 2010 ketika saya menjawab ini) bahwa jika enum memiliki sifat yang lebih umum, saya menyimpannya di file yang terpisah. Secara kontekstual saya maksudkan bahwa dalam beberapa kasus beberapa enum mungkin berada dalam file terpisah, dan dalam kasus lain, saya mungkin mengelompokkan satu set deklarasi enum dalam satu file.
Nikos Steiakakis
10

Itu tergantung pada akses apa yang dibutuhkan.

Jika enum hanya digunakan oleh satu kelas, tidak apa-apa untuk mendeklarasikannya di dalam kelas itu karena Anda tidak perlu menggunakannya di tempat lain.

Untuk enum yang digunakan oleh beberapa kelas atau dalam API publik, maka saya akan selalu menyimpan definisi dalam file sendiri di namespace yang sesuai. Jauh lebih mudah untuk menemukan cara itu, dan strateginya mengikuti pola one-object-per-file, yang bagus untuk digunakan dengan kelas dan antarmuka juga.

Jon Seigel
sumber
8

Saya pikir itu tergantung pada ruang lingkup enum. Sebagai contoh jika enum khusus untuk satu kelas, misalnya digunakan untuk menghindari skenario konstanta sihir, maka saya akan mengatakan memasukkannya ke file yang sama dengan kelas:

enum SearchType { Forward, Reverse }

Jika enum bersifat umum dan dapat digunakan oleh beberapa kelas untuk skenario yang berbeda, maka saya akan cenderung menggunakan memasukkannya ke dalam file sendiri. Misalnya, di bawah ini dapat digunakan untuk beberapa tujuan:

enum Result { Success, Error }
Vishal Mistry
sumber
6

Saya cenderung untuk meletakkan enums di file mereka sendiri untuk alasan yang sangat sederhana: seperti halnya dengan kelas dan struct, senang mengetahui secara tepat ke mana harus mencari jika Anda ingin menemukan definisi tipe: dalam file dengan nama yang sama. (Agar adil, di VS Anda selalu dapat menggunakan "Go to Definition," juga.)

Jelas, itu bisa lepas kendali. Seorang kolega tempat saya bekerja bahkan membuat file terpisah untuk delegasi.

Dan Tao
sumber
6

Salah satu keuntungan menggunakan file terpisah untuk enums adalah Anda dapat menghapus kelas asli yang menggunakan enum dan menulis kelas baru menggunakan enum.

Jika enum tidak tergantung dari kelas asli maka memasukkannya ke dalam file terpisah membuat perubahan di masa depan lebih mudah.

Doug Ferguson
sumber
6

Jika Anda menggunakan add-in Browser File USysWare untuk Visual Studio, Anda dapat dengan cepat menemukan file dengan nama tertentu dalam solusi Anda. Bayangkan mencari enum yang tidak ada dalam file sendiri tetapi malah dikubur dalam beberapa file dalam solusi raksasa.

Untuk solusi kecil, itu tidak masalah, tetapi untuk solusi besar, menjadi semakin penting untuk menjaga kelas dan enum dalam file mereka sendiri. Anda dapat dengan cepat menemukan mereka, mengeditnya, dan banyak lagi. Saya sangat, sangat merekomendasikan menempatkan enum Anda di file sendiri.

Dan seperti yang dinyatakan ... Seberapa boros file yang akhirnya hanya menjadi beberapa kb?

Batalla
sumber
Saya menggunakan add-in itu juga, ini sangat berguna. Saya akan meletakkan enums di file mereka sendiri, tidak peduli apakah solusinya besar atau kecil.
Rui Jarimba
5

Sangat besar keuntungannya untuk memisahkan file. Ketika objek apa pun dalam file MyObjectName.cs sendiri ... Anda dapat pergi ke explorer solusi dan ketik MyObjectName.cs dan ditampilkan tepat 1 file. Apa pun yang membuat debugging lebih baik itu bagus.

Keuntungan lain pada catatan yang sama, jika Anda mencari semua file ( ctrl+ shft+ F) untuk sebuah nama, Anda dapat menemukan 20 referensi untuk nama dalam file yang sama ... dan nama yang ditemukan akan menjadi bagian dari objek yang berbeda. Di jendela Temukan Hasil, Anda hanya dapat melihat nomor baris dan nama file. Anda harus membuka file dan gulir untuk mencari tahu di mana objek referensi yang ditemukan berada.

Apa pun yang membuat proses debug lebih mudah, saya suka.

vbp13
sumber
3

Jika Anda memiliki banyak proyek dalam satu solusi. Maka lebih baik buat proyek lain Utilities. Kemudian buat Folder \Enumerationsdan buat bersarang static class. Dan kemudian tetapkan setiap kelas statis di mana Anda akan membuat enum yang sesuai dengan nama proyek Anda. Misalnya Anda memiliki proyek bernama DatabaseReader dan DatabaseUsers maka Anda dapat memberi nama seperti kelas statis

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

}

Kemudian seluruh enum yang dapat digunakan dalam seluruh solusi per proyek akan dinyatakan di dalamnya. Gunakan # regionuntuk memisahkan setiap masalah. Dengan ini, lebih mudah untuk mencari enum

Ocbina Israel
sumber
1

Saya suka memiliki satu file enum publik bernama E yang berisi masing-masing enum yang terpisah, maka enum apa pun dapat diakses dengan E ... dan mereka berada di satu tempat untuk dikelola.

Patrick Kafka
sumber