Nilai Berbilang dalam Pengisytiharan Enum: Penyelaman Lebih Dalam ke dalam CLR
Tidak seperti struct, enum dikategorikan sebagai jenis nilai ringan yang mewakili set pemalar dinamakan. Walau bagaimanapun, perkara yang dikemukakan oleh soalan ialah pemerhatian yang menarik bahawa enum nampaknya boleh membenarkan berbilang nilai untuk diberikan kepada pemalar yang sama.
Menyelidiki butiran pelaksanaan Common Language Runtime (CLR), menjadi jelas bahawa enums pada asasnya serupa dengan struct. Di sebalik tabir, enum berasal daripada kelas asas System.Enum dan pada asasnya adalah struct dengan nilai pemalar yang dipratentukan.
Pertimbangkan contoh pengisytiharan enum:
public enum Color { Red = 1, Blue = 1, Green = 1 }
CLR secara dalaman mentafsirkan pengisytiharan ini seperti berikut :
public struct Color : System.Enum { public const int Red = 1; public const int Blue = 1; public const int Green = 1; }
Walaupun C# melarang eksplisit pengisytiharan kelas asas untuk struct, CLR tetap menjana perwakilan ini untuk enum.
Kehadiran berbilang pemalar dengan nilai yang sama dalam jenis enum tidak menimbulkan masalah. Walau bagaimanapun, penetapan nilai bukan unik ini boleh mengakibatkan tingkah laku yang tidak dijangka semasa penukaran kepada jenis enum.
Sebagai contoh:
Color color1 = (Color)1; Color color2 = (Color)Enum.Parse(typeof(Color), "1");
Kedua-dua warna1 dan warna2 akan ditetapkan kepada nilai Merah kerana penetapan nilai pertama adalah sewenang-wenangnya. Secara teknikal, warna1 mahupun warna2 tidak diberikan Merah; sebaliknya, ia memegang nilai 1. Tetapi apabila dipaparkan, Merah ialah apa yang anda akan lihat.
Selain itu, operasi perbandingan antara nilai enum bukan unik mungkin menghasilkan hasil yang mengejutkan:
// true (Red is Green??) bool b = Color.Red == Color.Green;
Persamaan ini berlaku kerana nilai berangka asas untuk Merah dan Hijau ialah 1.
Walaupun tingkah laku ini bukan sememangnya bermasalah, ia memerlukan pertimbangan apabila menggunakan enum dengan nilai bukan unik. Adalah penting untuk menentukan sama ada keunikan ini sejajar dengan tujuan dan semantik reka bentuk enum anda yang dimaksudkan.
Atas ialah kandungan terperinci Bolehkah Enum dalam C# Memegang Berbilang Nilai dengan Pemalar Dasar yang Sama, dan Apakah Implikasinya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!