Bayangkan saya telah mendefinisikan Enum berikut:
public enum Status : byte
{
Inactive = 1,
Active = 2,
}
Apa praktik terbaik untuk menggunakan enum? Haruskah dimulai dengan 1
seperti contoh di atas atau dimulai dengan 0
(tanpa nilai eksplisit) seperti ini:
public enum Status : byte
{
Inactive,
Active
}
Jawaban:
Pedoman Desain Kerangka :
Panduan Desain Kerangka / Desain Bendera Enums :
sumber
switch
pernyataan itu akan melompat kedefault
bagian, di mana saya melemparInvalidEnumArgumentException
. Jika tidak, sebuah program mungkin secara tidak sengaja terus berjalan dengan nilai nol dari pencacahan, yang mungkin valid dan tidak diperhatikan.Yah, saya rasa saya tidak setuju dengan sebagian besar jawaban yang mengatakan tidak secara eksplisit menomori mereka. Saya selalu secara eksplisit memberi nomor mereka, tetapi itu karena dalam banyak kasus saya akhirnya menahan mereka dalam aliran data di mana mereka disimpan sebagai nilai integer. Jika Anda tidak secara eksplisit menambahkan nilai dan kemudian menambahkan nilai baru Anda dapat menghentikan serialisasi dan kemudian tidak dapat secara akurat memuat objek lama yang ada. Jika Anda akan melakukan semua jenis penyimpanan persisten dari nilai-nilai ini maka saya akan sangat merekomendasikan pengaturan nilai secara eksplisit.
sumber
Enum adalah tipe nilai dan nilai defaultnya (misalnya untuk bidang Enum di kelas) akan menjadi 0 jika tidak diinisialisasi secara eksplisit.
Oleh karena itu Anda biasanya ingin memiliki 0 sebagai konstanta yang ditentukan (mis. Tidak Diketahui).
Dalam contoh Anda, jika Anda ingin
Inactive
menjadi default, maka nilainya harus nol. Jika tidak, Anda mungkin ingin mempertimbangkan untuk menambahkan konstantaUnknown
.Beberapa orang merekomendasikan agar Anda tidak secara eksplisit menentukan nilai konstanta Anda. Mungkin nasihat yang bagus dalam banyak kasus, tetapi ada beberapa kasus ketika Anda ingin melakukannya:
Tandai enum
Enum yang nilainya digunakan dalam interop dengan sistem eksternal (misalnya COM).
sumber
[Flags] enum MyFlags { None = 0, A, B, Both = A | B, /* etc. */ }
jauh lebih mudah dibaca, daripada[Flags] enum MyFlags { None = 0, A = 1, B = 2, Both = 3, /* etc */ }
.)[Flags] enum MyFlags { None=0, A, B, C }
akan menghasilkan[Flags] enum MyFlags { None=0, A=1, B=2, C=3 }
, sedangkan untuk enum Flags Anda biasanya ingin C = 4.Kecuali Anda memiliki alasan khusus untuk mengubahnya, biarkan enum dengan nilai defaultnya, yang dimulai dari nol.
public enum Status : byte { Inactive, Active }
sumber
Saya akan mengatakan praktik terbaik adalah tidak menomori mereka dan membiarkannya tersirat - yang akan dimulai dari 0. Sejak implisit, preferensi bahasa yang selalu baik untuk diikuti :)
sumber
Saya akan memulai enum tipe boolean dengan 0.
Kecuali "Inative" berarti sesuatu selain "Inactive" :)
Ini mempertahankan standar untuk mereka.
sumber
Saya akan mengatakan, itu tergantung pada bagaimana Anda menggunakannya. Untuk menandai enum, praktik yang baik adalah menggunakan 0 untuk
None
nilai, seperti itu:[Flags] enum MyEnum { None = 0, Option1 = 1, Option2 = 2, Option3 = 4, All = Option1 | Option2 | Option3, }
Ketika enum Anda kemungkinan besar akan dipetakan ke tabel pencarian database, saya akan memulainya dengan 1. Seharusnya tidak terlalu penting untuk kode yang ditulis secara profesional, tetapi ini meningkatkan keterbacaan.
Dalam kasus lain saya akan membiarkannya apa adanya, tidak peduli apakah mereka mulai dengan 0 atau 1.
sumber
Kecuali Anda memiliki alasan kuat untuk menggunakan nilai mentah, Anda sebaiknya hanya menggunakan nilai implisit dan mereferensikannya
Status.Active
danStatus.Inactive
.Tangkapannya adalah Anda mungkin ingin menyimpan data dalam file datar atau DB, atau menggunakan file datar atau DB yang dibuat orang lain. Jika Anda membuatnya sendiri, buatlah penomorannya sesuai dengan kegunaan Enum.
Jika datanya bukan milik Anda, tentu saja Anda akan ingin menggunakan apa pun yang digunakan pengembang asli sebagai skema penomoran.
Jika Anda berencana menggunakan Enum sebagai satu set flag, ada konvensi sederhana yang layak untuk diikuti:
enum Example { None = 0, // 0 Alpha = 1 << 0, // 1 Beta = 1 << 1, // 2 Gamma = 1 << 2, // 4 Delta = 1 << 3, // 8 Epsilon = 1 << 4, // 16 All = ~0, // -1 AlphaBeta = Alpha | Beta, // 3 }
Nilai harus merupakan pangkat dua dan dapat diekspresikan menggunakan operasi bit-shift.
None
, jelas harus0
, tetapiAll
kurang jelas-1
.~0
adalah negasi biner dari0
dan menghasilkan angka yang setiap bitnya disetel1
, yang mewakili nilai-1
. Untuk tanda gabungan (sering digunakan untuk kenyamanan) nilai lain dapat digabungkan menggunakan bitwise atau operator|
.sumber
Jangan tetapkan nomor apa pun. Gunakan saja seperti yang seharusnya digunakan.
sumber
Jika tidak ditentukan penomoran dimulai dari 0.
Penting untuk eksplisit karena enum sering berseri dan disimpan sebagai int, bukan string.
Untuk enum apa pun yang disimpan dalam database, kami selalu secara eksplisit memberi nomor opsi untuk mencegah pengalihan dan penugasan ulang selama pemeliharaan.
Menurut Microsoft, konvensi yang disarankan adalah menggunakan opsi nol pertama untuk mewakili nilai default yang tidak diinisialisasi atau paling umum.
Di bawah ini adalah jalan pintas untuk memulai penomoran dari 1, bukan 0.
public enum Status : byte { Inactive = 1, Active }
Jika Anda ingin menyetel nilai bendera untuk menggunakan operator bit pada nilai enum, jangan mulai penomoran pada nilai nol.
sumber
Jika Anda mulai dari 1, maka Anda dapat dengan mudah menghitung barang-barang Anda.
{ BOX_THING1 = 1, BOX_THING2 = 2, BOX_NUM_THING = BOX_THING2 };
Jika Anda mulai dari 0, gunakan nilai pertama sebagai nilai untuk hal-hal yang belum diinisialisasi.
{ BOX_NO_THING = 0, BOX_THING1 = 1, BOX_THING2 = 2, BOX_NUM_THING = BOX_THING2 };
sumber
Pertama-tama, kecuali Anda menentukan nilai tertentu karena suatu alasan (nilai numerik memiliki arti di tempat lain, misalnya Database atau layanan eksternal) maka jangan tentukan nilai numerik sama sekali dan biarkan nilai tersebut eksplisit.
Kedua, Anda harus selalu memiliki item bernilai nol (dalam enum non-flags). Elemen itu akan digunakan sebagai nilai default.
sumber
Jangan memulainya dari 0 kecuali ada alasan untuk itu, seperti menggunakannya sebagai indeks untuk larik atau daftar, atau jika ada alasan praktis lainnya (seperti menggunakannya dalam operasi bitwise).
Anda
enum
harus mulai tepat di tempat yang diperlukan. Ini juga tidak perlu berurutan. Nilai, jika ditetapkan secara eksplisit, perlu mencerminkan beberapa makna semantik atau pertimbangan praktis. Misalnya,enum
"botol di dinding" harus diberi nomor dari 1 hingga 99, sedangkanenum
untuk pangkat 4 mungkin harus dimulai dari 4 dan dilanjutkan dengan 16, 64, 256, dll.Selain itu, menambahkan elemen bernilai nol ke dalam
enum
seharusnya hanya dilakukan jika itu mewakili status yang valid. Kadang-kadang "tidak ada", "tidak diketahui", "hilang", dll. Adalah nilai yang valid, tetapi seringkali tidak.sumber
Saya suka memulai enum saya dari 0, karena itu defaultnya, tapi saya juga suka memasukkan nilai Unknown, dengan nilai -1. Ini kemudian menjadi default dan kadang-kadang dapat membantu debugging.
sumber