23 Ocak 2010 Cumartesi

C# ve Enumeration (Enum) Kullanımı

Bu makalemde C# sunduğu iki değer türünden biri olan enumeration’ı size anlatacağım. Program yazarken bir çok değişken tanımlar ve bu değişkenlere  sayısal değer  vererek işlemimize başlarız. Ama bu yöntem çokta fazla sezgisel değildir.
Örneğin programımızda haftanın günlerini sunmak istediğimizi düşünelim. Birde günlerle karmaşık işlemler yapacağımız düşünelim. Bunun için  hergüne sayısal değer vermemiz yeterli olacaktır. Pazartesi, Salı, Çarşamba, Perşembe, Cuma, Cumartesi, ve Pazar’a    0,1,2,3,4,5 ve 6 tam sayı değerlerini tanımlamamız yeterli olacak ve bu tamsayılar üzerinden işlemlerimiz gerçekleşecektir. Ama sıfırı (0) kullandıktan ve bir süre sonra kodumuza bakarken sıfırın Pazartesi’ni ifade ettiğini anlamak zor olacaktır. Bu durumda C# güzel bir çözüm sunar ve değerlerin grup sembolik bir adla bildirebileceğimiz enum anahtar sözcüğünü kullanırız.
Bir Enumeration türü bildirmek
Enum DaysOfTheWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
 }
Enumeration’a  erişmek
Yukarıda haftanın günlerini tanımlayan bir enumeration tanımladık. Burdan sadece Cumartesi gününün değerini almak istersek,
DaysOfTheWeek day = DaysOfTheWeek.Saturday;
MessageBox.Show(day.ToString());
Mesaj kutumuzda “6” yazacaktır.
Bu noktada size tüm değer türleri gibi, ? düzenleyici kullanarak enumlandırma değişkeni boş değer alabileceğini hatırlatmak isterim. Daha sonra enumda tanımlanmış bir değer atayabilir veya null değerde set edilebilir.
Haftanın günlerinin hepsini birden almak istersek .GetNames() metodunu kullanırız. Bu metod yardımıyla enum içerisinde kullandığımız değerleri  string formatında bir dizide kullanabiliriz.
Örneğin  string[] days  = Enum.GetNames(typeof(DaysOfTheWeek));  bu kod yardımıyla  artık  days string dizisinde enumdaki elemanlarımız var.
İsterseniz bir tamsayı sabitini bir enum sabitiyle ilişkilendirebilirsiniz.

Örneğin;
enum DaysOfTheWeek
{
Monday,
Tuesday  =  1,
Wednesday = 3,
Thursday,
Friday,
Saturday,
Sunday
 }

Birden çok numaralandırma kalıbına aynı değerde verilebilir.  Örneğin İngiltere’de  Sonbahar için fall yerine Autumn kullanılır. Bunu tanımlayan bir enum kalıbı tanımlıyacak olursak şu şekilde olur.

Enum Season
{
Spring,
Summer,
Fall = Autumn,
Winter
}

string[] days  = Enum.GetNames(typeof(DaysOfTheWeek));
Tekrar başa dönerek DaysOfTheWeek’te tanımladığımız haftanın günlerini combobox ile kullanıya seçtirmek istiyoruz. Bunun içinde haftanın günlerini combobox’ın içine atmamız gerekmekte bunun için şu kodu yazmamız yeterli olacaktır.

// İlk önce Get.Names(); metodunu kullanarak string bir dizinin içerine günleri atıyorum
string[] days  = Enum.GetNames(typeof(DaysOfTheWeek));
// Daha sonra bu dizinin içerisinde dönerek her bir string değeri combobox ın içerisine atıyorum.
       foreach(string day in days)
       {
            daysCombo.Item.Add(day);
       } 
Artık daysCombo adındaki combobox’ta sırasıyla DayOfTheWeek’teki sabitlerimiz eklenmiş durumda.

Birde şunu anlatmanın yararlı olacağını düşünüyorum. DaysOfTheWeek  sabitlerinin içerisinde bir kontrol  yaparak istediğimiz sabitin enum altında tanımlı olan bir sabit olup, olmadığını görmek için IsDefined(); metodunu kullanmamız yeterli olacaktır. Bu metod bool bir sonuç gönderir. Dikkat etmemiz gereken şey ise case sensitive çalışmasıdır.

Örneğin ;
bool success = Enum.IsDefined(typeof(DaysOfTheWeek), “Thursday”);
İf(success)
{
       MessageBox.Show(“Found”);
}
else
{
       MessageBox.Show(“Not Found”);
}


Bu örnek bize Perşembe gününün haftanın günleri enumunda tanımlı olup olmadığını göstericek eğer tanımlı ise IsDefined metodundan tru dönecek ve mesaj kutumuzda bulundu yazacak, yoksa false değer döndürecek ve bulunamadı mesajı ile karşılaşacağız.

Eğer isDefined metodunda şunu yazmış olsaydık,

Enum.IsDefined(typeof(DaysOfTheWeek), “THURSDAY”);
Bu bize false dönecekti. Dikkat etmenizde yarar var.

enum sabitleriyle ToString() metodunun kullanılması.
Burada hemen parametre değerlerini ve işlevlerini açıklamak ve nasıl kullanıcalağını göstermenin yeterli olacağını düşünüyorum.
Parametre Değeri
İşlevi
G
Enum sabiti içerisindeki ilgili değeri genel(General) formatta yazar.
D
Enum sabiti içerisindeki ilgili değerin sayısal(Decimal) karşılığını yazar.
X
Enum sabiti içerisindeki ilgili değerin Hexadecimal (16lı sayı sistemindeki) karşılığını yazar.
 F
FlagsAttribute’ unun kullanılıp kullanılmamasına göre ilgili enum sabiti değerinin string karşılığını yazar.



9 yorum:

  1. vakit ayırdığınız için ben teşekkür ederim

    YanıtlaSil
  2. emrah bey, teşekkürler.

    enumda, değeri 3 olanın ismini nasıl bulabiliriz?

    YanıtlaSil
  3. int x = (int) Enum.Parse(typeof (CategoriesType), Enum.GetName(typeof (CategoriesType), mycategory));

    sanırım bu size yardımcı olacaktır.

    YanıtlaSil
  4. cok yararli oldu. tskler

    YanıtlaSil
  5. öncelikle çok teşekkürler. fakat bahsettiğiniz gibi DaysOfTheWeek için enum yarattıktan sonra şu adımları takip ettim;

    DaysOfTheWeek day = DaysOfTheWeek.Saturday;
    MessageBox.Show(day.ToString());
    Mesaj kutumuzda “6” yazacaktır.

    ancak mesaj kutumda "6" yerine "saturday" sonucunu aldım?

    YanıtlaSil
    Yanıtlar
    1. yukarıdaki analtım yanlış mı yanii ?

      Sil
    2. Hangi anlatım yanlış mı?

      Sil
    3. Anlatımda bir yanlış yok arkadaşlar...

      Sil