Enum tentu bisa membuat kodenya lebih mudah dibaca. Masih ada beberapa hal yang harus diperhatikan (setidaknya dalam .net)
Karena penyimpanan yang mendasari enum adalah int, nilai default-nya adalah nol, jadi Anda harus memastikan bahwa 0 adalah default yang masuk akal. (Misalnya, struct memiliki semua bidang disetel ke nol saat dibuat, jadi tidak ada cara untuk menetapkan default selain 0. Jika Anda tidak memiliki nilai 0, Anda bahkan tidak dapat menguji enum tanpa mentransmisikan ke int, yang akan menjadi gaya buruk.)
Jika enum Anda bersifat pribadi untuk kode Anda (tidak pernah diungkapkan secara publik) maka Anda dapat berhenti membaca di sini.
Jika enum Anda diterbitkan dengan cara apa pun ke kode eksternal dan / atau disimpan di luar program, pertimbangkan untuk menomori mereka secara eksplisit. Kompilator secara otomatis menomori mereka dari 0, tetapi jika Anda mengatur ulang enum Anda tanpa memberinya nilai, Anda dapat berakhir dengan cacat.
Saya bisa menulis secara legal
WriteMode illegalButWorks = (WriteMode)1000000;
file.Write( data, illegalButWorks );
Untuk mengatasi hal ini, kode apa pun yang menggunakan enum yang tidak dapat Anda yakini (mis. API publik) perlu memeriksa apakah enum tersebut valid. Anda melakukan ini melalui
if (!Enum.IsDefined(typeof(WriteMode), userValue))
throw new ArgumentException("userValue");
Satu-satunya peringatan Enum.IsDefined
adalah bahwa ia menggunakan refleksi dan lebih lambat. Itu juga mengalami masalah versi. Jika Anda perlu sering memeriksa nilai enum, sebaiknya Anda melakukan hal berikut:
public static bool CheckWriteModeEnumValue(WriteMode writeMode)
{
switch( writeMode )
{
case WriteMode.Append:
case WriteMode.OverWrite:
break;
default:
Debug.Assert(false, "The WriteMode '" + writeMode + "' is not valid.");
return false;
}
return true;
}
Masalah pembuatan versi adalah bahwa kode lama mungkin hanya tahu bagaimana menangani 2 enum yang Anda miliki. Jika Anda menambahkan nilai ketiga, Enum.IsDefined akan menjadi true, tetapi kode lama belum tentu dapat menanganinya. Ups.
Ada lebih banyak kesenangan yang bisa Anda lakukan [Flags]
enum, dan kode validasinya sedikit berbeda.
Saya juga akan mencatat bahwa untuk portabilitas, Anda harus menggunakan panggilan ToString()
pada enum, dan menggunakannya Enum.Parse()
saat membacanya kembali. Keduanya ToString()
dan Enum.Parse()
dapat menangani[Flags]
enum, jadi tidak ada alasan untuk tidak menggunakannya. Pikiran Anda, itu adalah kesalahan lain, karena sekarang Anda bahkan tidak dapat mengubah nama enum tanpa mungkin memecahkan kode.
Jadi, terkadang Anda perlu menimbang semua hal di atas ketika Anda bertanya pada diri sendiri Bisakah saya lolos hanya dengan bool?