C# Enumeration (Enum) Kullanımı



Enum kısaca sabitleri geliştirici tiplerdir. Yani Enum bize sayıları anlamlı şekilde isimlendirilerek kullanılabilmesini sağlayacaktır. Şimdi bunu nasıl yaptığını görelim:

  • Enum Tanımlamak :
    public enum Renk
    {
            Siyah, Beyaz, Sari, Kirmizi
    }
    Bu şekilde Renk isminde bir Enum tanımlamış olduk.

    •  GetNames() Metodunun Kullanımı :

      Yukarıda Renk isminde bir enum yaratıp ve içine de "Siyah, Beyaz, Sari, Kirmizi" renklerini koymuştuk. Eğer biz bu renklere erişmek istersek GetNames metodunu kullanabiliriz. Yani GetNames metdodu bir enum sabiti içerisindeki değerleri alıp string formatında bir diziye atamamızı sağlamaktadır. Örnek bir kullanıma bakarsak :

      /* Bu kod Renk enumundaki sabitleri yani tanımladığımız 4 rengi(Siyah, Beyaz, Sari, Kirmizi) alıp string tipinde tanımlanmış renkler dizisine atar.*/
      string[] renkler = Enum.GetNames(typeof(Renk));

      Mesala buna örnek bir kullanım düşünürsek. Diyelim ki kullanıcıya Renk enumumuzdan gelen renkleri combobox ile seçtirmek istiyoruz. Bunu nasıl yaparız :

      /* Yukarıda oluşturduğumuz renkler dizisinin elemanlarını teker teker alıp combobox kontrolüne ekleyecek foreach yapısı */
      foreach (string eklenecekRenk in renkler)
      {
          // ComboBox kontrolüne eklenir.
          cmbRenkler.Items.Add(
      eklenecekRenk);

      • Enum.Parse() Metodunun Kullanımı:
       Diyelim ki kullanıcı programda combobox'ımızdan herhangi bir rengi seçti, bizde seçilen bu bilginin enum sabitimiz içerisindeki hangi değere karşılık geldiğini tespit etmek istiyorsak Enum.Parse metodu bize yardımcı olacaktır. Nasıl kullanıldığına bakarsak :
      /*Renk enum tipinde tanımlanmış SecilenRenk metodu renkAdi parametresini alarak bu renkAdini Renk enumu içinde arar.*/

      private Renk SecilenRenk(string renkAdi)
      {
          return (
      Renk)Enum.Parse(typeof(Renk ,renkAdi, true);
      }

      Parse metodunun işleyişi SecilenRenk metoduna gelen renkAdi parametresini alarak Renk enumu içinde arar. Parse metodunun boolean değer alan son parametresi ise büyük küçük harf duyarlılığının olup olmayacağını belirlemek amacıyla kullanılır. Burada "true" vermişiz yani BEYAZ ile Beyaz'ın programımız için bir farkı yok ama "false" yapsaydık ikisini farklı değerler olarak algılayacaktı.
      • Enum Sabitleriyle ToString() Metodunun Kullanımı
      Enum tanımlamayı, GetNames metodunu ve Parse metodunu öğrendikten sonra şimdiden Enum Sabitleriyle ToString() metodunun farklı kullanışlarını göreceğiz.


      Parametre Değeri
      İşlevi
      G veya g
      Enum sabiti içerisindeki ilgili değeri genel(General) formatta yazar.
      D veya d
      Enum sabiti içerisindeki ilgili değerin sayısal(Decimal) karşılığını yazar.
      X veya x
      Enum sabiti içerisindeki ilgili değerin Hexadecimal (16lı sayı sistemindeki) karşılığını yazar.
      F veya f
      FlagsAttribute’ unun kullanılıp kullanılmamasına göre ilgili enum sabiti değerinin string karşılığını yazar.


      Örneğin şimdi SınıfGecme adında bir Enum tanımlayalım.

      public enum SinifGecme
      {
      Gecti = 1
      ,Butunlemede = 2
      ,Kaldi = 3
      }

      static void Main(string[] args)
      {
      SinifGecme sg;
      sg = SinifGecme.Gecti;
      Console.WriteLine("Varsayılan : " + sg.ToString());
      Console.WriteLine("General : " + sg.ToString("G"));
      Console.WriteLine("Flags : " + sg.ToString("F"));
      Console.WriteLine("Decimal : " + sg.ToString("D"));
      Console.WriteLine("Hexadecimal : " + sg.ToString("X"));
      }

      Programın çıktısı :

      C# Enumeration (Enum) Kullanımı,java,c#,object orieneted,nesneye yönelik programlama,nesneye yönelik programlama dersleri,nesneye yönelik programlama nedir?


      Yani bu şekilde enum'um istenilen özelliğine ToString() ile ulaşabiliyoruz.

      Veya ile Enum Kullanımı

      Bazı durumlarda enum sabitlerini veya "|" ile kullanmak durumdan olabiliriz. Mesela :


      SinifGecme sg = SinifGecme.Gecti | SinifGecme.Kaldi;
      Eğer çıktımızı görmek için programımıza bu kod parçacığını görmek için kopyalayıp yeniden çalıştırırsak

      Program :
      public enum SinifGecme
      {
      Gecti = 1
      ,Butunlemede = 2
      ,Kaldi = 3
      }

      static void Main(string[] args)
      {
      SinifGecme sg = SinifGecme.Gecti | SinifGecme.Kaldi;
      Console.WriteLine("Varsayılan : " + sg.ToString());
      Console.WriteLine("General : " + sg.ToString("G"));
      Console.WriteLine("Flags : " + sg.ToString("F"));
      Console.WriteLine("Decimal : " + sg.ToString("D"));
      Console.WriteLine("Hexadecimal : " + sg.ToString("X"));
      }
      Bu durumda ekran çıktısı :

      C# Enumeration (Enum) Kullanımı,java,c#,object orieneted,nesneye yönelik programlama,nesneye yönelik programlama dersleri,nesneye yönelik programlama nedir?


      Görüldüğü gibi "SinifGecme.Gecti | SinifGecme.Kaldi;" ifademizin sonucu Gecti ve Kaldı enum sabitlerinin toplamı olan 1 + 2 = 3 değerini verir yani bitsel bir toplam söz konusudur. Bu yüzden enum sabitlerine değerler verirken veya kullanacaksak toplamlarının diğer bir enum sabitinin eşiti olmamasına özen göstermeliyiz. Tabi her zaman böyle 3 sabitle işlem yapmayacağız bu durumda nasıl ikisinin toplamı diğer bir enum sabitinin değeri olmadığını anlarız? Bunun için bir sabitin değerinin kendinden önce gelen değerlerin toplamından bir fazla olması öngörülür.


      Bu durumda bizde sınıf geçme enumumuzu bu kurala göre düzenlersek :


      public enum SinifGecme
      {
      Gecti = 1
      ,Butunlemede = 2
      ,Kaldi = 4
      }

      şeklinde değerler vermeyiliz. (Gecti = 1) + (Butunlemede = 2) = 3 ise Kaldi enumumuzun değeri 3 ün bir fazlası 4 olmalıdır. Bu durumda programımız :

      public enum SinifGecme
      {
      Gecti = 1
      ,Butunlemede = 2
      ,Kaldi = 4
      }

      static void Main(string[] args)
      {
      SinifGecme sg = SinifGecme.Gecti | SinifGecme.Kaldi;
      Console.WriteLine("Varsayılan : " + sg.ToString());
      Console.WriteLine("General : " + sg.ToString("G"));
      Console.WriteLine("Flags : " + sg.ToString("F"));
      Console.WriteLine("Decimal : " + sg.ToString("D"));
      Console.WriteLine("Hexadecimal : " + sg.ToString("X"));
      }

      Programın çıktısı :
      C# Enumeration (Enum) Kullanımı,java,c#,object orieneted,nesneye yönelik programlama,nesneye yönelik programlama dersleri,nesneye yönelik programlama nedir?

      şeklinde olacaktır. Ama hala hatalarımız mevcut görüldüğü gibi değerler arasında sadece flag istediğimiz değeri vermiş, diğerleri Gecti ve Kaldı enum değerlerinin toplamını vermiş. (1 + 4 = 5)

      • [Flags] Kullanımı
      Enum tanımından önce kullanıcağımız [Flags] bize bu durumun çözümünü verir. Bu durumda kodumuzun son durumu :


      [Flags]
      public enum SinifGecme
      {
      Gecti = 1
      ,Butunlemede = 2
      ,Kaldi = 4
      }

      static void Main(string[] args)
      {
      SinifGecme sg = SinifGecme.Gecti | SinifGecme.Kaldi;
      Console.WriteLine("Varsayılan : " + sg.ToString());
      Console.WriteLine("General : " + sg.ToString("G"));
      Console.WriteLine("Flags : " + sg.ToString("F"));
      Console.WriteLine("Decimal : " + sg.ToString("D"));
      Console.WriteLine("Hexadecimal : " + sg.ToString("X"));
      }

      Bu durumda çıktımız :

      C# Enumeration (Enum) Kullanımı,java,c#,object orieneted,nesneye yönelik programlama,nesneye yönelik programlama dersleri,nesneye yönelik programlama nedir?


      Görüldüğü gibi istediğimiz formatta enumları veya kullanarak ToString metodu ile formatlamayı başardık.

      IsDefined() Metodunun Kullanımı :

      IsDefined metodu bir enum değişkeninin ilgili enum sabiti içerisinde var olup olmadığına dair bool değer döndüren bir özelliktir. Örnek kullanımına bakarsak :

      boolean varmi;
      varmi = Enum.IsDefined(typeof(Renk),"Beyaz"));
      Görüldüğü gibi ilk oluşturduğumuz Renk enumunu dikkate alırsak burada bu enum içinde "Beyaz" var mı diyea rar bulursa true bulamazsa false değer döndürür. Fakat birde şunu arayalım :

      varmi = Enum.IsDefined(typeof(Renk),"BEYAZ"));
      Bu durumda enumumuz içinde beyaz rengi olduğu halde bu false döndürecektir. Özellikle bu veriyi kullanıcıdan alıyorsak bu metod bizim işimize pek ayaramıcaktır. Bu yüzden bu iş için daha önce gördüğümüz Parse metodunu kullanmak daha akıllıca olacaktır.

      Ama yinede ben bu metodu kullanmak istiyorum derseniz Burak Selim Şenyurt enumlarla ilgili bir yazısında bunu nasıl gerçekleştireceğimizi çok güzel bir şekilde anlatmış oradan bunu öğrenebilirsiniz. Burak Selim Şenyurt : Enum Sabitinin Bilinmeyen Yönleri



      Kaynaklar :

      Burak Selim Şenyurt : Enum Sabitinin Bilinmeyen Yönleri

      4 yorum :