• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 8/2/2020 11:38:31 PM'Basit' Yazılım Dili
  • 6/25/2020 3:18:13 PMderleme hatası
  • 12/11/2017 4:49:15 PMWindows Hizmeti Hk.
  • 4/23/2016 12:55:33 AMC programlama 2 oyun

Popüler Sorular

  • 5/27/2012 5:49:50 AMAsp.Net ile Date time alana veri ekleyemiiyorum ?
  • 4/2/2012 12:45:18 AM.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 5/12/2012 8:44:49 AMAcil Yardım
  • 5/27/2012 1:46:51 PMveri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LibreOffice
  • LINQ
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

Çoklu Enum Değerleriyle Çalışmak

Çoklu Enum Değerleriyle Çalışmak

14.03.2013

Yazar: İlkay İlknur (Google+)

Kategori: C#.Net

3293

 

.NET Framework içerisindeki enumerationların yapısına baktığımızda eminim ki bir çoğumuz her bir enum üyesinin tek bir değer taşıdığını biliyoruzdur. Örneğin aşağıdaki gibi yetkileri temsil eden bir enumeration’ımız olduğunu düşünelim.

 

 

public enum Yetki
{
    Ekleme,
    Silme,
    Degistirme
}

 

Buraya kadar herşey yolunda :) Şimdi diyelim ki bu enumerationı kullanarak yetkilerin atamasını yapan bir metot yazacağız ve bu metot içerisinde ilgili kullanıcıya birden fazla yetki ataması yapılmasına da olanak sağlayacağız.

Bu istekleri ilk olarak düşündüğümüzde aklımıza gelen en basit yöntem tabi ki metot parametresi olarakYetki tipini taşıyan bir list veya array almak. Öyleyse bu şekilde bir implemantasyon yapalım.

 

class Program
{
    static void Main(string[] args)
    {
        var list = new List()
            {
                Yetki.Degistirme,
                Yetki.Ekleme
            };
        YetkiAta(list.ToArray());
    }

    static void YetkiAta(Yetki[] yetkiler)
    {
        Console.WriteLine("Verilen Yetkiler: " + yetkiler.ToString());
        foreach (Yetki yetki in yetkiler)
        {
            Console.WriteLine(yetki.ToString());
        }
    }
}

Koda baktığımızda aslında her şey yolunda gibi. Kodu çalıştırıp bir de sonucu inceleyelim.

 

Çıkan sonuca baktığımızda aslında tek bir şey haricinde her şey yolunda gibi. Yolunda olmayan tek şey ise gelen yetkilerin tamamını doğru bir şekilde yazdıramamamız. Bunun yanında bir de metot kullanımına baktığımızda metodu kullanan developerın elindeki yetkileri toplayarak bir list veya array oluşturmasını sağlayarak aslında yazdığımız metodun kullanımını biraz da olsa zorlaştırmaktayız. Ayrıca ileride Admin veya modarator gibi içerisinde birden fazla yetkiyi barındıran üyeler tanımlamak istediğimizde bu üyelerin hangi yetkileri taşıdığını mecburen YetkiAta metodu içerisine gömeceğiz.

Peki başka çaremiz var mı ? :)

 

Flags Attribute

FlagsAttribute sınıfı System namespace’i altında bulunmakla beraber bizim tanımlamış olduğumuz enumerationlara çoklu değerler vermemizi sağlamakta. Bunu da yaparken aslında arka planda bit operasyonlarını kullanmakta. Peki Flags attribute’ünü nasıl kullanıyoruz ? Hemen o konuya gelelim. İlk olarak enumeration tanımımızın üzerine Flags attribute’ünü yerleştiriyoruz.

[Flags]
public enum Yetki
{
    Ekleme,
    Silme,
    Degistirme
}

Bir önceki paragrafı hatırlarsanız flags attribute’ünü eklediğimizde artık enum valueları üzerinde bit operasyonları gerçekleştirebileceğimizden bahsetmiştim. İşte bu bit operasyonlarından dolayı enum valuelarına da 2′nin üstleri (1,2,4,8,16…) değerler vermeliyiz ki runtime arka planda bu operasyonları kendisi handle edebilsin. Öyleyse Yetki enumını yukarıdaki kurallara göre değiştirelim.

[Flags]
public enum Yetki
{
    Ekleme=1,
    Silme=2,
    Degistirme=4
}

Bunları yaptıktan sonra peki metodumuz içerisindeki kullanım nasıl olacak ? Hemen enumeration’ın yeni durumuna göre kodu güncelleyelim.

class Program
{
    static void Main(string[] args)
    {
        YetkiAta(Yetki.Degistirme | Yetki.Ekleme);
    }

    static void YetkiAta(Yetki yetkiler)
    {
        Console.WriteLine("Verilen Yetkiler: " + yetkiler.ToString());

        if (yetkiler.HasFlag(Yetki.Ekleme))
        {
            Console.WriteLine("Ekleme yetkisi istendi");
        }
        if (yetkiler.HasFlag(Yetki.Silme))
        {
            Console.WriteLine("Silme yetkisi istendi");
        }
        if (yetkiler.HasFlag(Yetki.Degistirme))
        {
            Console.WriteLine("Degistirme yetkisi istendi");
        }
    }
}
[Flags]
public enum Yetki
{
    Ekleme = 1,
    Silme = 2,
    Degistirme = 4
}

 

Kodumuzun yeni haline baktığımızda aslında bazı farklılıklar olduğunu farketmişinizdir. Bu değişikliklerden ilki YetkiAta metodu içerisindeki if kontrolleri. Her ne kadar ilk baktığımızda bu kontroller kötü dursa da bu noktada aslında başka bir çaremiz yok gibi. Çünkü artık metot parametresine baktığımızda list veya array tipinde bir parametremiz yok. Sadece Yetki enumeration’ı alıyoruz parametre olarak. Haliyle bu enumeration içerisinde birden fazla değer taşıyabildiği için kontrollerimizi HasFlag metoduyla yapıyoruz. HasFlag metodu eğer elimizdeki enum değeri içerisinde, parametre olarak verdiğimiz enum değerini barındırıyorsa bize true değerini dönüyor.

Şimdi yazdığımız kodu çalıştıralım.

 

Ekran görüntüsünden de farkettiyseniz Flags attribute’ünü kullanmanın güzelliklerinden biri deToString metodunun çağrımında artık çoklu enum değeri içerisindeki tüm enum değerlerinin virgülle ayrılarak yazılması. Bunun yanında Flags attribute’ünü kullandığımızda Enum tipi içerisinde bulunan Parse metodu içerisinde çoklu enum isimlerini virgül ile ayırarak verdiğimizde ilgili değerlerin otomatik olarak Enum’a atanması mümkün. Örneğin,

class Program
{
    static void Main(string[] args)
    {
        Yetki yetki = (Yetki)Enum.Parse(typeof(Yetki), "Silme,Ekleme");
        Console.WriteLine(yetki.ToString());
    }
}

[Flags]
public enum Yetki
{
    Ekleme = 1,
    Silme = 2,
    Degistirme = 4
}

Kodu çalıştırdığımızda gördüğünüz gibi enumerationa Silme,Ekleme otomatik olarak atanıyor veToString metoduyla otomatik olarak ekrana yazılıyor.

Son olarak bahsedeceğim özellik ise enumlar içerisinde de Flags attribute’ü kullanarak birden fazla değeri içerisinde barındıran üyeler tanımlayabilmemiz. Örneğin yetkilere Admin ve Moderatör olarak 2 yeni kavram ekleyelim ve Admin’in tüm yetkileri olacağını, moderatörün ise sadece silme ve değiştirme yapabileceğini düşünelim. Bunun için enumeration içerisinde yapmamız gereken 2 yeni üye tanımlayıp bu üyelere gerekli yetkileri vermek.

class Program
{
    static void Main(string[] args)
    {
        Yetki yetki = Yetki.Admin;
        YetkiAta(yetki);
    }

    static void YetkiAta(Yetki yetkiler)
    {
        Console.WriteLine("Verilen Yetkiler: " + yetkiler.ToString());

        if (yetkiler.HasFlag(Yetki.Ekleme))
        {
            Console.WriteLine("Ekleme yetkisi istendi");
        }
        if (yetkiler.HasFlag(Yetki.Silme))
        {
            Console.WriteLine("Silme yetkisi istendi");
        }
        if (yetkiler.HasFlag(Yetki.Degistirme))
        {
            Console.WriteLine("Degistirme yetkisi istendi");
        }
    }
}

[Flags]
public enum Yetki
{
    Ekleme = 1,
    Silme = 2,
    Degistirme = 4,
    Admin = Ekleme | Silme | Degistirme,
    Moderator = Silme | Degistirme
}

 

Yukarıda gördüğünüz gibi “Verilen Yetkiler” kısmında enum Admin olarak gelirken YetkiAta metodu içerisinde Enum.HasFlag metodunu kullanarak yaptığımız yetki kontrollerinde Admin’in sahip olduğu esas yetkilere tek tek ulaşabildik.

Evet bu yazımızda Flags attribute’ü ile ilgili olarak bahsedeceklerimiz bu kadar. Aslında çok basit senaryolarda belki ilk olarak gördüğümüz list veya array üzerinden ilerleyebiliriz. Ancak Flags attribute’ü ile beraber gelen esneklikler de gözardı edilecek şeyler olmadığını düşünüyorum. Tabi yerine göre gelecek olan avantajları ve yükleri doğru olarak öngörmemiz lazım.

Hoşçakalın

 

 

Yazar Hakkında

İlkay İlknur

İlkay İlknur

www.ilkayilknur.com

2008 yılından itibaren yazılım geliştirme dünyasında yer alan İlkay İlknur şu ana kadar bankacılık uygulamaları ve müşterilere özel custom uygulamalar geliştirmiştir. Şu anda Amerika'da bulunan XOMNI firmasında Software Engineer olarak çalışmaktadır.Genel olarak blogunda C# ve XAML tabanlı platformlarla(Windows Phone,Windows 8,Silverlight) ilgili paylaşımlarda bulunmaktadır ve vakit buldukça üniversitelerde ve topluluk etkinliklerinde bu konular üzerinde oturumlar gerçekleştirmektedir. İlkay İlknur ayrıca Visual C# alanında MVP ünvanına sahiptir.

Sosyal Medya

ORANLAR

  • 3293izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Merhaba, ellerinize sağlık çok yardımcı ol...
  • Merhaba Bu uygulama örneğinden ASP.net ...
  • Hocam Link başka sayfaya yönlendiriyor.

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 124174
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 71418
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 51996
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ