.Net 5.0 İle Enum İşlemler

Selamlar,

Resim Kaynağı: https://sunrisemarketplace.com/wp-content/uploads/2017/09/SMP-books-banner.jpg

Resim Kaynağı: https://sunrisemarketplace.com/wp-content/uploads/2017/09/SMP-books-banner.jpg

Bu makalede, kodlarda bolca kullandığımız Enumlara, biraz daha detaylı inceleyeceğiz. Kod okunaklığının artması ya da bir başka deyişle 1,2,3 gibi anlamsız sayıların yerine anlamalı kelimelerin kullanılması, Enumların esas amacıdır. Peki bu enumlarda kullanılan kelimeleri boşluklu ve türkçe karakterler ile kullanmak istersek. Ya da işi daha da ileriye götürüp, bu Enumlardaki elemanları bir komboda listelemek ister isek ne yapmalıyız ?

Genelde bu gibi sorunlardan dolay gördüğüm en yanlış çözüm, aşağıdaki gibi static bir list’in, <key> ve <value> propertyleri olan bir model ile doldurulması olmuştur. Böylece ilgili liste içinde hem türkçe karakter bulundurulabiliyor, hem de istenen ComboBox’a datasource olarak gösterilebiliyordu. Aşağıdaki sınıfta static propertyler Enum gibi kullanılmak amacı ile, ilgili liste de ComboBox doldurmak amacı ile tanımlanmıştır. Tabi ki bütün bu tanımlamalara gerek yoktur. Zira sayısal, örneğin “2” şeklinde gelen bir SalesPriceType değerinin value karşılığını bulmak, ilgili liste içinden büyük bir performans kaybına neden olacaktır.

Örnek Kullanım şekli: 

“İnsanlar seni yanlış anladığında dert etme, duydukları senin sesin, fakat aklından geçirdikleri kendi düşünceleridir.”
―Mevlana

Enum Çözümü:

Öncelikle Enum’da türkçe karakter ve boşluk sorununu “[Display]” DataAnnotation’ı ile çözebiliriz.

SalesPriceType: Aşağıdaki Enum’da kullanılmak istenen tüm Açıklamalar, “Display” attribute’ü ile tanımlanmıştır. Görüldüğü gibi içinde, hem türkçe karakter hem de boşluk mevcuttur.

Örnek Kullanım Şekli:

Bir Liste olarak, seçilen bir comboya doldurulucak olan Enum model aşağıdaki gibidir:

Gelin şimdi Enum üstündeki [DisplayAttribute] değerini veren, bir Extension yazalım.

1-) GetDisplayAttribute(): Aşağıdaki method, öncelikle kendisine gelen nesnenin, Enum olup olmadığına bakar. Daha sonra eğer Enum ise, “DisplayAttribute” field’ı var ise geri dönülür yok ise null dönülür. Aşağıdaki kodda akla gelebilecek tek sıkıntı, “GetCustomAttribute()” methodunun System.Reflection kütüphanesinden gelmesi ve bunun da performans üzerinde biraz da olsa etkisinin olmasıdır.

Extension

2-)EnumExtensions/GetDisplayName(): Aşağıda, Enum’a yazılan GetDisplayName extension’ını görüyoruz. Yukarıda tanımlanan “GetDisplayAttribute()”, methodu ile ilgili çekilen DisplayAttribute‘nun değeri geri dönülür.

Örnek Kullanım Şekilleri:

  1. Örnekde, “NakitToptFiyatı” enum değerinin “[Display(Name)]” attribute’ü Console’a basılmıştır.
  2. Örnekde, “2” değerine karşılık gelen SalesPriceType Enumunun “[Display(Name)]” attribute’ü Console’a basılmıştır.

3-) GetEnumList<T>() : Aşağıda görüldüğü gibi, <T> tipinde istenen bir Enumun DisplayName’i ve Value’su, KeyValuePair model şeklinde bir Liste olarak geri dönülmektedir.

Örnek Kullanım Şekli:

Aşağıda görüldüğü gibi “SalesPriceType” enumunun, [Display(Name)] ve buna karşılık gelen [Value] değeri Console’a basılmaktadır. Bu şekilde Key-Value tanımlaması ile istenen bir combo, Türkçe ve boşluklu olarak kolaylık dolurulabilir.

“Sorunlar, onları yaratanların mantığı ile çözümlenemez.”

―Albert Einstein

Enum Flags ve Bitwise :

Aşağıdaki Enum liste bakıldığında, [Flags] şeklinde bir attribute görülmektedir. Ve value değerleri 2’nin katı şeklinde artmaktadır. Buradaki Flags keyword’ü, birden fazla enum değerinin bir değişkene atanabilmesine imkan vermektedir.

Örnek bir değişkene birden fazla değerin atanması: Aşağıdaki örnekde boraAttacker’a hem “Axe” hem de “Rifle” değerleri atanmıştır.

Aşağıdaki örnekde, “HasFlag()” methodu ile aranan Axe enumunun boraAttacker’ın içinde olup olmadığı sorgulanmış ve “True” değeri dönülmüştür.

Aşağıdaki kodun sonucu 33‘dür. (Axe  = 1) + (Rifle = 32) = 33 toplamlarının sonucudur. Çünkü ilgili değişkene, her iki enum değeri atanmıştır.

Gelin boraAttacker’ın içinde bulunan tüm enumları listeleyelim. Öncelikle yukarıda yazılan “GetEnumList<T>()” methodu ile, WeaponType’a ait tüm listeyi “key, value” şeklinde alıp listeleyelim. Daha sonra, herbir elemanı “HasFlag()” methodunu kullanarak boraAttacker’in içinde var mı diye kontrol edelim. Olan silahları console’a yazdıralım.

Ekran çıktısı: Aşağıda görüldüğü gibi, boraAttacker’a tanımlı tüm WeaponType enumları listelenmektedir.

Bu makalede, kodlarda bolca kullanılan Enumlara biraz daha detaylı baktık. Özellikle Bitwise ile çoklu atamların yapılması ve Enumların bir liste olarak kullanılıp comboların doldurulması, bize hem kodlarda büyük kolaylık sağlıyacak hem de gereksiz kod kalabalığından kurtulmamızı olanak sağlıyacaktır. Türkçe karakter sorunu ve combobox doldurmak için Enumlar yerine oluşturulan static listlerden, daha sonrasında linq ve çeşitli sorgular ile data çekilmesi performans ve memory management anlamında özellikle yüksek trafikde bize sorunlara neden olacaktır.

Geldik bir makalenin daha sonuna.

Yeni bir makalede görüşmek üzere hepinize hoşçakalın.

Source Code: https://gist.github.com/borakasmer/0f38dd4a3b2b52535544254038ff2a77

Source :

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

4 Cevaplar

  1. Tagi dedi ki:

    Daydalı oldu.
    Teşekkürler.

  2. Cihan Yakar dedi ki:

    Ufak bir düzeltme: 2’nin katı değil kuvveti şeklinde artmaktadır.

    • borsoft dedi ki:

      Selam Cihan,
      Öncelikle teşekkürler. 2’nin kuvvetleri kesinlikle daha doğru bir ifade.
      Sadece 2 için 2si de aynı kapıya çıkıyor :)
      2’ye özel olarak 2’nin katları aynı anda 2’nin kuvvetleri oluyor :)
      Yani pratikte kullanış şekli, her zaman enson kaydın ID’sini bul ve 2 ile çarpıp bir sonraki item’ın ID’si olarak ata.
      2*2 = 2^2
      2*2*2=2^3
      2*2*2*2=2^4

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.