Rumah > pembangunan bahagian belakang > C++ > Mengapa Menghantar Integer ke Enum dalam .NET Tidak Membuang Pengecualian?

Mengapa Menghantar Integer ke Enum dalam .NET Tidak Membuang Pengecualian?

DDD
Lepaskan: 2025-01-03 17:46:40
asal
737 orang telah melayarinya

Why Does Casting an Integer to an Enum in .NET Not Throw an Exception?

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());
Salin selepas log masuk

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());
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan