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 RenkBu şekilde Renk isminde bir Enum tanımlamış olduk.
{
Siyah, Beyaz, Sari, Kirmizi
}
- 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ı:
/*Renk enum tipinde tanımlanmış SecilenRenk metodu renkAdi parametresini alarak bu renkAdini Renk enumu içinde arar.*/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ı.
private Renk SecilenRenk(string renkAdi)
{
return (Renk)Enum.Parse(typeof(Renk ,renkAdi, true);
}
- Enum Sabitleriyle ToString() Metodunun Kullanımı
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ı :
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());Bu durumda ekran çıktısı :
Console.WriteLine("General : " + sg.ToString("G"));
Console.WriteLine("Flags : " + sg.ToString("F"));
Console.WriteLine("Decimal : " + sg.ToString("D"));
Console.WriteLine("Hexadecimal : " + sg.ToString("X"));
}
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ı :
ş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ı
[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 :
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;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"));
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
süpersiniz yararlı oldu
YanıtlaSilteşekkürler..
YanıtlaSilGerçekten muhteşemsiniz, teşekkürler...
YanıtlaSilAçıklayıcı ve yararlı bir kaynak eyvallah.
YanıtlaSil