Menghantar Int ke Nilai Enum Tidak Sah: Memahami Gelagat Tidak Dijangka
Berbeza dengan pengendalian nilai enum Java yang tegar, enum .NET mempamerkan tingkah laku yang tidak dijangka apabila menghantar nilai integer tidak sah kepada jenisnya. Untuk menggambarkan ini, pertimbangkan kod berikut:
enum Beer { Bud = 10, Stella = 20, Unknown } var i = 50; var b = (Beer) i; Console.WriteLine(b.ToString());
Daripada melemparkan pengecualian, kod secara mengejutkan menghantar i ke Beer dan mencetak "50" ke konsol. Mengapa ini berlaku?
Di sebalik tabir, enum disokong oleh jenis nilai asas seperti int atau pendek. Ini membolehkan mereka menyimpan sebarang nilai yang sah untuk jenis ini. Oleh itu, walaupun Beer enum hanya mempunyai tiga nilai yang ditentukan, ia masih boleh menampung i yang bukan salah satu daripadanya.
Tingkah laku tertentu ini berpunca daripada keputusan yang dibuat oleh pencipta .NET. Walaupun ia mempunyai kelebihannya, ia juga telah mendapat kritikan kerana potensinya membawa kepada ralat masa jalan.
Menangani Kebimbangan
Untuk menangani isu ini, beberapa pembangun telah mencipta kaedah utiliti seperti EnumUtil dan EnumExtensions yang menyediakan tingkah laku cepat gagal untuk enum. Kaedah ini memastikan bahawa nilai enum ditakrifkan sebelum menghantarnya untuk mengelakkan pengecualian yang tidak dijangka.
Berikut ialah contoh menggunakan EnumUtil:
var definedValue = EnumUtil<Beer>.DefinedCast(i); // Throws exception if i is not defined in Beer Console.WriteLine(definedValue.ToString());
Melebihi Penjelasan
Tingkah laku unik enum dalam .NET juga membenarkan penggunaan enum "bendera bit". Enum ini memanfaatkan corak binari untuk mewakili berbilang bendera aktif dalam satu nilai enum. Ini amat berguna dalam senario di mana mentakrifkan setiap kemungkinan gabungan bendera akan menyusahkan.
Kesimpulan
Walaupun sesetengah orang mungkin mendapati tingkah laku pemutus enum dalam .NET pelik, adalah penting untuk memahami rasional asas dan pilihan yang tersedia untuk memastikan tingkah laku yang gagal apabila mengendalikan enum yang tidak sah nilai. Dengan menggunakan kaedah utiliti atau mempertimbangkan kemungkinan bit flag enum, pembangun boleh mengurangkan potensi kelemahan ciri .NET unik ini.
Atas ialah kandungan terperinci Mengapa Menghantar Integer ke Enum dalam .NET Tidak Membuang Pengecualian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!