C Sharp Programlama Dili/Enum sabitleri

Ders 15. Enum sabitleri


Enum sabitleri sayesinde bazı özel sözcüklerin bazı tam sayıları temsil etmesini sağlayabiliriz. En genel enum bildirimi şu şekilde yapılır:

 enum AD : tur{SOZCUK1,SOZCUK2}

Bu bildirimde enum sabitinin adı ADdır. tur ise sözcüklerin hangi türden sabitleri temsil edeceğini belirtir. Parantez içindeki sözcükler ise herhangi bir sabiti temsil etmesini istediğimiz sözcüklerdir. Parantez içine en fazla türün kapasitesi kadar sözcük girilebilir. Örneğin tur yerine byte yazmışsak en fazla 255 tane sözcük girebiliriz.

 enum AD{SOZCUK1,SOZCUK2}

Burada bir tür belirtmediğimiz için otomatik olarak tür int olur. Enum sabitlerinin türünü byte, sbyte, short, ushort, int, uint, long ve ulong türlerinden biri yapabiliriz. Şimdi enum sabitleriyle ilgili bir örnek yapalım. Örneğimizde bir metot kendisine ilk parametre olarak gönderilen dizinin elemanlarını ekrana yazsın. Metodun ikinci parametresinde de dizinin elemanlarının ekrana nasıl yazılacağı ayarlansın. Eğer ikinci parametre YANINA olarak girilirse dizinin elemanları ekrana yan yana yazılsın. Eğer ikinci parametre ALTINA olarak girilirse dizinin elemanları ekrana alt alta yazılsın:

 using System;
 enum BICIM : byte{YANINA,ALTINA}
 class Program
 {
    static void DiziYaz(Array dizi,BICIM b)
    {
       if(b==BICIM.YANINA)
       {  
          foreach(object o in dizi)
             Console.Write(o.ToString()+" ");
          Console.WriteLine();
       }
       else
          foreach(object o in dizi)
             Console.WriteLine(o);
    }
    static void Main()
    {
       int[] a=new int[10];
       DiziYaz(a,BICIM.YANINA);
       DiziYaz(a,BICIM.ALTINA);
    }
 }

Şimdi başka bir örnek:

 using System;
 enum not:byte{basarisiz,gecmez,gecer,orta,iyi,pekiyi}
 class Program
 {
    static void Main()
    {
       Console.Write("Lütfen notunuzu giriniz: ");
       not a=(not)Convert.ToByte(Console.ReadLine());
       Console.WriteLine(a);
    }
 }

Bu program ekrana kullanıcı 0 girerse basarisiz, 1 girerse gecmez, 2 girerse gecer, 3 girerse orta, 4 girerse iyi ve 5 girerse pekiyi yazmaktadır. Eğer kullanıcı 5'ten büyük bir sayı girerse sayıyı yazacaktır. Enum sözcüklerinin verilen türe göre temsil ettikleri bir tam sayı vardır. Biz enum sabitini tanımlarken herhangi bir ek düzenleme yapmadığımız için ilk sözcük 0'ı temsil eder. Diğer sözcükler de birer artarak kendi sayılarını temsil eder. Yani aşağıdaki tablo söz konusudur:

Sözcük Temsil ettiği sayı
basarisiz 0
gecmez 1
gecer 2
orta 3
iyi 4
pekiyi 5

Ayrıca gördüğünüz gibi programımızda byte türünü not türüne (enum sabitine) bilinçli olarak dönüştürdük. Bilinçsiz olarak dönüştüremezdik. Ayrıca direkt olarak stringten nota dönüşüm yapamazdık. Şimdi başka bir program:

 using System;
 enum not:byte{basarisiz,basarili}
 class Program
 {
    static void Main()
    {
       not a=not.basarili;
       if(a==(not)1)
          Console.Write("Başarılısınız");
       else
          Console.Write("Başarısızsınız");
    }
 }

Burada da int türü not türüne bilinçli olarak dönüştürüldü. Başka bir örnek:

 using System;
 enum not:byte{basarisiz,basarili}
 class Program
 {
    static void Main()
    {
       Console.Write(not.basarisiz);
    }
 }

Bu programda ekrana basarisiz yazılır. Yani enum sözcükleri direkt kullanılmak istendiğinde yalnızca sözcük kullanılıyor. Başka bir örnek:

 using System;
 enum not:byte{basarisiz,basarili}
 class Program
 {
    static void Main()
    {
       not a=not.basarisiz;
       byte b=(byte)a;
       Console.Write(b);
    }
 }

Burada da not türü byte'a bilinçli olarak dönüştürüldü.

ÖZET: Enum tipi ile enum'un baz tamsayı tipi arasında bilinçli tür dönüşümü yapılabilir, bilinçsiz tür dönüşümü yapılamaz.

NOT: Özetteki kuralın istisnası 0'dır. 0, ilgili enum tipine bilinçsiz olarak dönüşebilir. Örnek:

enum BICIM{DIKEY, YATAY}
class Sinif
{
    static void Main()
    {
        BICIM b=0; //b'ye DIKEY atandı.
    }
}

Ancak tersine dönüşüm mümkün değildir. Yani burada b değişkeni, int'e bilinçsiz olarak dönüşemez.

Eğer iki sözcüğe aynı tam sayıyı vermişsek bu iki sözcük birbirine eşit sayılır. Birinin yerine diğeri kullanılabilir. Örnek:

using System;
enum BICIM { DIKEY=6,YATAY=6}
class AnaProgram
{
    static void Main()
    {
        BICIM b = BICIM.DIKEY;
        BICIM b2 = BICIM.YATAY;
        Console.WriteLine(b == b2);
    }
}

Bu program ekrana "TRUE" çıktısını verir.

Enum sıra numaralarını değiştirme

değiştir

enum not:byte{basarisiz,basarili} satırında sözcükler 0'dan başlayarak birer birer artarak bir tam sayıyı temsil eder. Ancak hangi sözcüğün hangi tam sayıyı temsil ettiğini kendimiz belirtebiliriz. Örnekler:

 enum not:byte{basarisiz=6,basarili=10}

Bu örnekte basarisiz 6'yı, basarili 10'u temsil eder. Bir tam sayı birden fazla sözcüğe verilebilir.

 enum not:byte{basarisiz=6,basarili}

Bu örnekte basarisiz 6'yı, basarili 7'yi temsil eder.

 enum not:byte{basarisiz,gecmez=5,gecer,orta,iyi=2,pekiyi}

Bu örnekte ise şu temsiller söz konusudur:

Sözcük Temsil ettiği sayı
basarisiz 0
gecmez 5
gecer 6
orta 7
iyi 2
pekiyi 3
 enum not:byte{basarisiz=-21,basarili}

Bu örnekte basarisiz -21'i basarili -20'yi temsil eder.

NOT: Bir enum değişkenine enumda olmayan bir sözcüğün sayı karşılığı dönüşüm operatörünü kullanmak şartıyla atanabilir.

NOT: Enum değişkenlerinin varsayılan değeri 0 değerinin ilgili enum tipine çevrilmiş halidir. Örnek:

using System;
enum deneme { Ahmet }
class Deneme
{
    static void Main()
    {
        deneme d = new deneme();
        Console.WriteLine(d);
    }
}

Bu program ekrana "Ahmet" çıktısını verir.

System.Enum sınıfı

değiştir

System.Enum sınıfı enum sabitleriyle kullanılabilecek çeşitli üye elemanlara sahiptir. Burada yalnızca GetNames() metodu tanıtılacaktır. GetNames() metodu bir enum sabitinin tüm sözcüklerini string türündeki bir dizi olarak tutar. Örnek:

 using System;
 enum Gunler:byte
 {
    PAZARTESI,
    SALI,
    CARSAMBA,
    PERSEMBE,
    CUMA,
    CUMARTESI,
    PAZAR
 }
 class Sinif
 {
    static void Main()
    {
       string[] a=Gunler.GetNames(typeof(Gunler));
       Console.WriteLine(a[0]);
       //veya
       Console.WriteLine(Gunler.GetNames(typeof(Gunler))[3]);
    }
 }

Bu örnek ekrana alt alta PAZARTESI ve PERSEMBE yazar.

NOT: Enum sabitine isim verirken ve enum sözcüklerini yazarken değişken adlandırma kurallarının tamamına uymalıyız.

Bu kitabın diğer sayfaları
  • Sınıflar
  • Operatör aşırı yükleme
  • İndeksleyiciler
  • Yapılar
  • Enum sabitleri
  • İsim alanları
  • System isim alanı
  • Temel I/O işlemleri
  • Temel string işlemleri
  • Kalıtım
  • Arayüzler
  • Kısmi tipler ve metotlar
  • İstisnai durum yakalama mekanizması
  • Temsilciler
  • Olaylar
  • Önişlemci komutları
  • Göstericiler
  • Assembly kavramı
  • Yansıma
  • Nitelikler
  • Örnekler
  • Şablon tipler
  • Koleksiyonlar
  • yield
  • Veri tabanı işlemleri
  • XML işlemleri
  • Form tabanlı uygulamalar
  • Visual Studio.NET
  • Çok kanallı uygulamalar
  • ASP.NET