İçeriğe geç

Enum

Enum (enumeration, sıralı liste), bir grup isimlendirilmiş sabit tanımlama yöntemidir. 0, 1, 2 gibi anlamını ezberlemek zorunda kaldığın çıplak sayılar yerine her değere bir isim verirsin.

enum Renk { Kirmizi, Yesil, Mavi }

Bu, Renk adında yeni bir tip ve üç olası değer oluşturur. Her değere 0’dan başlayan bir tamsayı indeks atanır: Kirmizi 0, Yesil 1, Mavi 2.

Enum değerlerine nokta sözdizimiyle erişilir:

Renk r = Renk.Yesil;

Enum değerini yazdırabilirsin; indeksini verir:

print(Renk.Kirmizi); // 0
print(Renk.Yesil); // 1
print(Renk.Mavi); // 2

Enum ve switch doğal bir ikili oluşturur:

enum Durum { Bekliyor, Aktif, Tamamlandi }
string durumAcikla(Durum d) {
switch (d) {
case Durum.Bekliyor: return "beklemede";
case Durum.Aktif: return "devam ediyor";
case Durum.Tamamlandi: return "bitti";
}
return "";
}
int main() {
Durum gorev = Durum.Aktif;
print(durumAcikla(gorev)); // "devam ediyor"
return 0;
}

Her case bir enum üyesini kapsar. Bir switch’in her üyeyi kapsaması zorunlu değildir; tüketicilik (exhaustiveness) denetimi yoktur, bu yüzden bazı üyeler işlenmiyorsa bir default ya da sonda bir return ekle.

Fonksiyonlara enum geçerek niyetini açıkça belirt:

enum Yon { Kuzey, Dogu, Guney, Bati }
void ilerle(Yon y) {
switch (y) {
case Yon.Kuzey: print("yukari"); break;
case Yon.Dogu: print("saga"); break;
case Yon.Guney: print("asagi"); break;
case Yon.Bati: print("sola"); break;
}
}

Enum olmasaydı bu fonksiyon int alırdı ve 7 geçerli bir yön olmadığı halde ilerle(7) derlenirdi. Yon parametresiyle tip denetleyici, Yon değeri olmayan her argümanı reddeder.

Enum değerlerini karşılaştırabilir ve int’e dönüştürebilirsin:

Yon y = Yon.Kuzey;
int indeks = y as int; // 0
if (y == Yon.Kuzey) {
print("kuzeye bakiyor");
}

Enum’lar doğrudan tamsayı değildir. Bir Yon değişkenine 0 atayamazsın; Yon.Kuzey yazman gerekir. Bu, ilgisiz sabitlerin yanlışlıkla birbirine karışmasını engeller.

İki yaklaşımı karşılaştır:

// int sabitlerle (hataya açık)
int SOLA_GIT = 0;
int SAGA_GIT = 1;
int YUKARI_GIT = 2;
void ilerle(int yon) { /* ... */ }
ilerle(7); // derlenir, hiçbir anlamı yok
// Enum ile (güvenli)
enum Hareket { Sola, Saga, Yukari }
void ilerle(Hareket yon) { /* ... */ }
// ilerle(7); // derleme hatası
ilerle(Hareket.Sola); // açık ve doğru

Enum ile ilerle(7), anlamsız bir değerle çalışan bir çağrı yerine bir derleme hatasıdır ve her çağrı yeri, çıplak bir tamsayı yerine geçirdiği değeri adlandırır (Hareket.Sola).