Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Jenis enumerasi (atau jenis enum) adalah jenis nilai yang ditentukan oleh sekumpulan konstanta bernama dari jenis numerik integral yang mendasar. Untuk menentukan jenis enumerasi, gunakan enum kata kunci dan tentukan nama anggota enum:
enum Season
{
Spring,
Summer,
Autumn,
Winter
}
Secara default, nilai konstanta terkait dari anggota enum berjenis int; mereka mulai dengan nol dan meningkat satu mengikuti urutan teks definisi. Anda dapat secara eksplisit menentukan jenis numerik integral lainnya sebagai jenis yang mendasar dari jenis enumerasi. Anda juga dapat secara eksplisit menentukan nilai konstanta terkait, seperti yang ditunjukkan contoh berikut:
enum ErrorCode : ushort
{
None = 0,
Unknown = 1,
ConnectionLost = 100,
OutlierReading = 200
}
Anda tidak dapat menentukan metode di dalam definisi jenis enumerasi. Untuk menambahkan fungsionalitas ke jenis enumerasi, buat anggota ekstensi.
Nilai default dari jenis E enumerasi adalah nilai yang dihasilkan oleh ekspresi (E)0, meskipun nol tidak memiliki anggota enum yang sesuai.
Konversi implisit dari nol
C# memungkinkan konversi implisit dari nilai 0 harfiah ke jenis enum apa pun, dan dari const nilai yang sama dengan nol. Perilaku ini dapat menyebabkan hasil yang tidak terduga ketika enum tidak menyertakan anggota dengan nilai nol:
public enum GpioPort
{
GpioA = 1,
GpioB,
GpioC,
GpioD
}
public class ZeroConversionExample
{
public static void Main()
{
// This compiles without warning but creates an invalid enum value
GpioPort port1 = (GpioPort)0;
Console.WriteLine($"port1: {port1}"); // Output: port1: 0
// This also compiles due to implicit conversion from zero
GpioPort port2 = GetPort(0);
Console.WriteLine($"port2: {port2}"); // Output: port2: 0
// Check if the enum value is valid
bool isValid1 = Enum.IsDefined(typeof(GpioPort), port1);
bool isValid2 = Enum.IsDefined(typeof(GpioPort), port2);
Console.WriteLine($"port1 is valid: {isValid1}"); // Output: port1 is valid: False
Console.WriteLine($"port2 is valid: {isValid2}"); // Output: port2 is valid: False
// Safer approach - validate enum values
if (Enum.IsDefined(typeof(GpioPort), 0))
{
GpioPort safePort = (GpioPort)0;
}
else
{
Console.WriteLine("Value 0 is not a valid GpioPort");
// Handle the invalid case appropriately
}
}
public static GpioPort GetPort(GpioPort port)
{
return port;
}
}
Dalam contoh sebelumnya, dan port1port2 diberi nilai 0, tetapi GpioPort tidak memiliki anggota dengan nilai tersebut. Metode Enum.IsDefined mengonfirmasi ini adalah nilai enum yang tidak valid.
Konversi implisit ini ada karena pola 0-bit adalah default untuk semua jenis struct, termasuk semua jenis enum. Namun, ini dapat memperkenalkan bug dalam kode Anda. Untuk menghindari masalah ini:
- Anda harus hampir selalu menentukan anggota dengan nilai
0dalam enum Anda. - Gunakan Enum.IsDefined untuk memvalidasi nilai enum saat mengonversi dari jenis numerik.
- Berhati-hatilah saat menggunakan parameter numerik yang mungkin dikonversi secara implisit ke jenis enum.
Anda menggunakan jenis enumerasi untuk mewakili pilihan dari sekumpulan nilai yang saling eksklusif atau kombinasi pilihan. Untuk mewakili kombinasi pilihan, tentukan jenis enumerasi sebagai bendera bit.
Jenis enumerasi sebagai bendera bit
Jika Anda ingin jenis enumerasi mewakili kombinasi pilihan, tentukan anggota enum untuk pilihan tersebut sehingga pilihan individual adalah bidang bit. Artinya, nilai terkait dari anggota enum tersebut harus menjadi kekuatan dua. Kemudian, Anda dapat menggunakan operator | logis bitwise atau & untuk menggabungkan pilihan atau berpotangan kombinasi pilihan, masing-masing. Untuk menunjukkan bahwa jenis enumerasi mendeklarasikan bidang bit, terapkan atribut Bendera ke bidang tersebut. Seperti yang ditunjukkan contoh berikut, Anda juga dapat menyertakan beberapa kombinasi khas dalam definisi jenis enumerasi.
[Flags]
public enum Days
{
None = 0b_0000_0000, // 0
Monday = 0b_0000_0001, // 1
Tuesday = 0b_0000_0010, // 2
Wednesday = 0b_0000_0100, // 4
Thursday = 0b_0000_1000, // 8
Friday = 0b_0001_0000, // 16
Saturday = 0b_0010_0000, // 32
Sunday = 0b_0100_0000, // 64
Weekend = Saturday | Sunday
}
public class FlagsEnumExample
{
public static void Main()
{
Days meetingDays = Days.Monday | Days.Wednesday | Days.Friday;
Console.WriteLine(meetingDays);
// Output:
// Monday, Wednesday, Friday
Days workingFromHomeDays = Days.Thursday | Days.Friday;
Console.WriteLine($"Join a meeting by phone on {meetingDays & workingFromHomeDays}");
// Output:
// Join a meeting by phone on Friday
bool isMeetingOnTuesday = (meetingDays & Days.Tuesday) == Days.Tuesday;
Console.WriteLine($"Is there a meeting on Tuesday: {isMeetingOnTuesday}");
// Output:
// Is there a meeting on Tuesday: False
var a = (Days)37;
Console.WriteLine(a);
// Output:
// Monday, Wednesday, Saturday
}
}
Untuk informasi dan contoh selengkapnya, lihat System.FlagsAttribute halaman referensi API dan anggota Non-eksklusif dan bagian atribut Bendera dari System.Enum halaman referensi API.
Tipe System.Enum dan batasan enum
Jenisnya System.Enum adalah kelas dasar abstrak dari semua jenis enumerasi. Ini menyediakan sejumlah metode untuk mendapatkan informasi tentang jenis enumerasi dan nilainya. Untuk informasi dan contoh selengkapnya, lihat System.Enum halaman referensi API.
Anda dapat menggunakan System.Enum dalam batasan kelas dasar (yang dikenal sebagai batasan enum) untuk menentukan bahwa parameter jenis adalah jenis enumerasi. Jenis enumerasi apa pun juga memenuhi struct batasan, yang digunakan untuk menentukan bahwa parameter jenis adalah jenis nilai yang tidak dapat diubah ke null.
Konversi
Untuk jenis enumerasi apa pun, ada konversi eksplisit antara jenis enumerasi dan jenis integral yang mendasarnya. Jika Anda melemparkan nilai enum ke jenis yang mendasarnya, hasilnya adalah nilai integral terkait dari anggota enum.
public enum Season
{
Spring,
Summer,
Autumn,
Winter
}
public class EnumConversionExample
{
public static void Main()
{
Season a = Season.Autumn;
Console.WriteLine($"Integral value of {a} is {(int)a}"); // output: Integral value of Autumn is 2
var b = (Season)1;
Console.WriteLine(b); // output: Summer
var c = (Season)4;
Console.WriteLine(c); // output: 4
}
}
Enum.IsDefined Gunakan metode untuk menentukan apakah jenis enumerasi berisi anggota enum dengan nilai terkait tertentu.
Untuk jenis enumerasi apa pun, ada konversi pengepakan dan pembongkaran ke jenis System.Enum dan dari jenis itu masing-masing.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian berikut dari spesifikasi bahasa C#:
- Enumerasi
- Nilai dan operasi Enum
- Operator logis enumerasi
- Operator perbandingan enumerasi
- Konversi enumerasi eksplisit
- Konversi enumerasi implisit