Enum Flag Özelliği

Enum, programlamada oldukça sık başvurulan, sayısal değerleri anlamlı bir şekilde isimlendirilerek kullanılabilmesini sağlayan yapıdır. Enum yapısı yaygın olarak her bir üyesinin tek bir değer taşıdığı hali ile kullanılır. Örneğin bir ev konum itibariyle tek bir şehirde yer alır. Bu durumda evin bulunduğu şehri bir enum yapısının tek bir üyesi ile aşağıdaki gibi gösterebiliriz:

public enum Sehirler {
   Ankara,
   Antalya,
   Istanbul,
   Kocaeli
}
ev.Konumu = Sehirler.Ankara;

Ancak bazen tek bir üye ifade için yeterli olmaz. Örneğin bir evin sahip olabileceği özellikler enum üyeleri ile temsil edildiğinde birden fazla özellik aynı evde bulunabilir. Bu durumda evin sahip olduğu özellikleri nasıl göstereceğimiz sorusu gündeme gelir.

public enum Ozellikler {
   Balkonlu,
   Klimali,
   Panjurlu,
   Otoparkli
}

Bu problemi çözmek için akla iki yöntem gelmektedir:

  • Olası tüm kombinasyonlar enum içinde üye olarak eklenir.
    public enum Ozellikler {
      Balkonlu,
      Klimali,
      Panjurlu,
      Otoparkli,
      BalkonluKlimali,
      BalkonluPanjurlu,
      BalkonluOtoparkli,
      KlimaliPanjurlu,
      KlimaliOtoparkli,
      PanjurluOtoparkli,
      BalkonluKlimaliPanjurlu,
      BalkonluKlimaliOtoparkli,
      BalkonluPanjurluOtoparkli,
      KlimaliPanjurluOtoparkli,
      BalkonluKlimaliPanjurluOtoparkli
    }
    
  • Evin sahip olduğu özellikler liste olarak tutulur
    ev.Ozellikleri = { Ozellikler.Balkonlu, Ozellikler.Klimali }
    

Birinci yöntem az sayıda özellik için kullanılabilir olsa da özellik sayısının fazla olması durumunda ortaya çok sayıda kombinasyon çıkacağından kullanılması zordur. İkicinci yöntem çok daha mantıklı gözükse de verilerin saklanması noktasında veritabanında fazladan tablo oluşturulması ve verinin okunup yazılması noktasında fazladan kodlama gerektirecektir.

Enum yapılarında kullanılan Flag özelliğine tam da bu noktada ihtiyaç duyulmaktadır. Flag özelliği arka planda enum üyeleri üzerinde mantıksal işlemler yaparak bize çoklu değerler kullanma imkanı verir. Flag özelliğinin kullanımı aşağıdaki gibidir:

[Flag]
public enum Ozellikler {
   Balkonlu = 1, 	// 2^0
   Klimali = 2, 	// 2^1
   Panjurlu = 4, 	// 2^2
   Otoparkli = 8 	// 2^3
}

Flag özelliğinin kullanımında dikkat edilecek olan nokta enum üye değerlerinin 1, 2, 4, 8 … şeklinde 2’nin üsleri olacak şekilde atanmasıdır. Burada amaç ikili düzende yapılacak olan mantıksal işlemlerle tüm kombinasyonları elde etmektir.

Bir enum yapısındaki üyeler ile elde edilebilecek tüm kombinasyonların sayısı n üye sayısı olmak üzere 2n-1’dir. (Hiçbir üyenin dahil olmadığı seçeneği yani boş kümeyi de düşünürsek sayı 2n olur.) 2n adet seçeneği ikilik düzende n basamak ile ifade edebiliriz.

Üye 10’luk Düzen 2’lik Düzen
Boş küme 0 0000
Balkonlu 1 0001
Klimali 2 0010
BalkonluKlimali 3 0011
Panjurlu 4 0100
BalkonluPanjurlu 5 0101
KlimaliPanjurlu 6 0110
BalkonluKlimaliPanjurlu 7 0111
Otoparkli 8 1000
BalkonluOtoparkli 9 1001
KlimaliOtoparkli 10 1010
BalkonluKlimaliOtoparkli 11 1011
PanjurluOtoparkli 12 1100
BalkonluPanjurluOtoparkli 13 1101
KlimaliPanjurluOtoparkli 14 1110
BalkonluKlimaliPanjurluOtoparkli 15 1111

Flag özelliğinin kodlama içerisinde kullanımı ise oldukça basittir. Değişkene atanmak istenen enum üyeleri mantıksal OR işlemine sokulur. Böylece enum değişkeni üzerinde istenen kombinasyonun saklanması sağlanır.

ev.Ozellikleri = Ozellikler.Balkonlu | Ozellikler.Otoparkli;

Elimizdeki enum değişkeninin belirli bir enum üyesini ya da belirli bir kombinasyonu barındırıp barındırmadığını belirlemek için HasFlag metodu kullanılır. HasFlag metodu değişken içerisinde, parametre olarak verdiğimiz enum üye(ler)ini barındırıyorsa geriye true değerini döner.

ev.Ozellikleri = Ozellikler.Balkonlu |
                 Ozellikler.Otoparkli |
                 Ozellikler.Klimali;
ev.Ozellikleri.HasFlag(Ozellikler.Klimali);	//true
ev.Ozellikleri.HasFlag(Ozellikler.Panjurlu);	//false
ev.Ozellikleri.HasFlag(Ozellikler.Balkonlu | Ozellikler.Otoparkli); //true
ev.Ozellikleri.HasFlag(Ozellikler.Balkonlu | Ozellikler.Panjurlu);  //false

Flag özelliğinin en güzel yanlarından birisi de ToString() metodu ile enum değişkeni içerisindeki tüm enum üyelerinin CVS formatında virgülle ayrılarak yazılıyor olmasıdır.

ev.Ozellikleri = Ozellikler.Balkonlu |
                 Ozellikler.Otoparkli |
                 Ozellikler.Klimali;
ev.Ozellikleri.ToString();	// Bankonlu, Otoparkli, Klimali

Bunun yanında enum tipi içerisinde bulunan Parse metodu içerisinde çoklu enum isimlerini virgül ile ayırarak verildiğinde ilgili değerlerin otomatik olarak atanması mümkündür.

ev.Ozellikleri = (Ozellikler)Enum.Parse(typeof(Ozellikler),
                                        "Bankonlu, Otoparkli");

Enum için izin verilen veri tipleri byte, sbyte, short, ushort, int, uint, long ve ulong’dur. Bu veri tiplerinden ulong kullanılması durumunda enum içinde maksimum 64 değer üye tanımlanabilir.

public enum WebAgentPermission : ulong
{
	RuleGroup = 1,						//2^0
	Location = 2,						//2^1
	VolumeStatistics = 4,				//2^2
	...
	UserPassword = 256,					//2^8
	...
	AuditLogs = 65536,					//2^16
              ...
	WebAgentReports = 4294967296,				//2^32
	...
	PespectiveSearch =  281474976710656,		//2^48
	...
	DictionaryManager = 9223372036854775808         //2^63
}

photo

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

%d blogcu bunu beğendi: