Setiap enum menyimpan anggotanya sebagai angka bertipe tertentu, dan tipe tersebut disebut underlying type. Tipe bawaannya adalah int, sehingga setiap anggota memakai empat byte memori. Kita dapat memilih tipe dasar lain seperti byte atau short untuk menghemat memori atau menyesuaikan format data yang ditentukan pihak lain, misalnya skema file atau protokol jaringan. Nilai anggota juga dapat kita tetapkan sendiri bila urutan beruntun tidak sesuai kebutuhan.

Memilih Tipe Dasar dan Nilai Eksplisit #

Contoh berikut mendefinisikan dua enum: satu memakai tipe dasar byte, satu lagi memakai nilai eksplisit:

csharp
public enum StatusPesanan : byte { Baru, Dibayar, Dikirim, Selesai }

public enum LevelStok { Habis = 0, Rendah = 10, Aman = 50 }

Console.WriteLine(Enum.GetUnderlyingType(typeof(StatusPesanan)));

byte nomorStatus = (byte)StatusPesanan.Dikirim;
Console.WriteLine(nomorStatus);

StatusPesanan dariAngka = (StatusPesanan)2;
Console.WriteLine(dariAngka);

Console.WriteLine((int)LevelStok.Rendah);
Console.WriteLine((int)LevelStok.Aman);

Output yang Dihasilkan:

text
System.Byte
2
Dikirim
10
50

Mari kita bedah baris demi baris:

  1. public enum StatusPesanan : byte { ... }: tanda titik dua setelah nama enum menyatakan underlying type; seluruh anggota kini disimpan sebagai byte dengan rentang 0 sampai 255.
  2. Enum.GetUnderlyingType(typeof(StatusPesanan)): method ini mengembalikan tipe dasar enum saat runtime; hasilnya System.Byte.
  3. (byte)StatusPesanan.Dikirim: cast ke tipe dasar mengambil angka di balik nama; Dikirim bernilai 2.
  4. (StatusPesanan)2: cast ke arah sebaliknya mengubah angka menjadi anggota enum; hasilnya Dikirim.
  5. LevelStok { Habis = 0, Rendah = 10, Aman = 50 }: nilai eksplisit menetapkan nomor tiap anggota; anggota tanpa nilai akan melanjutkan angka anggota sebelumnya.

Angka di Luar Daftar Nama #

Cast dari angka ke enum tidak memeriksa keberadaan nama. Ekspresi (StatusPesanan)99 tetap sah karena 99 berada di rentang byte, tetapi hasilnya tidak punya nama di daftar anggota. Method Enum.IsDefined membantu memeriksa kecocokan sebelum angka dipakai. Kontrak ketat ini membuat enum aman ditukar dengan sistem lain, sekaligus menuntut kita menjaga rentang nilai sesuai tipe dasar yang dipilih.

Daftar tipe dasar yang sah untuk enum terbatas pada keluarga bilangan bulat: byte, sbyte, short, ushort, int, uint, long, dan ulong. Tipe char maupun tipe pecahan tidak diperbolehkan, dan compiler langsung menolak deklarasi yang menyebutkannya. Perbedaan rentang nilai antar tipe tersebut telah dibahas pada section Variabel dan Tipe Data.