﻿
{"id":10190,"date":"2019-01-20T22:21:27","date_gmt":"2019-01-20T22:21:27","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=10190"},"modified":"2019-01-20T22:21:27","modified_gmt":"2019-01-20T22:21:27","slug":"c-flags-attributeu-ile-toplu-enumeration-tanimlama","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-flags-attributeu-ile-toplu-enumeration-tanimlama\/","title":{"rendered":"C# &#8211; Flags Attribute&#8217;u \u0130le Toplu Enumeration Tan\u0131mlama"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Enumeration, yap\u0131s\u0131 gere\u011fi bir veya birden fazla de\u011feri numaraland\u0131rmak ve bu atanan numaralar \u00fczerinden i\u015flem yapmak i\u00e7in kullan\u0131lan bir ara\u00e7t\u0131r. Kullan\u0131m olarak bir\u00e7ok varyasyonu bulunsada bunlar aras\u0131nda ama\u00e7sal olarak di\u011ferlerinden farkl\u0131l\u0131k g\u00f6stermeyen lakin i\u015flevsel olarak olduk\u00e7a farkl\u0131 nimetler sunan bir \u00f6zelli\u011fi mevcuttur. &#8220;Flags&#8221; \u00f6zelli\u011fi&#8230; Enumaration&#8217;lara &#8220;Flags&#8221; attribute&#8217;u ile kazand\u0131r\u0131lan bu \u00f6zellik sayesinde ilgili enumeration say\u0131sal bir i\u015flevsellik olan numaraland\u0131r\u0131c\u0131 \u00f6zelli\u011finden \u00e7\u0131karak, toplu numaraland\u0131r\u0131c\u0131 \u00f6zelli\u011fi g\u00f6steren farkl\u0131 bir tipe b\u00fcr\u00fcnebilmekte ve say\u0131sal de\u011fil koleksiyonel bir nitelik arz etmektedir. \u015eimdi gelin bu i\u00e7eri\u011fimizde Flags Attribute&#8217;u ile enumerationlar \u00fczerinde nas\u0131l bir de\u011fi\u015fiklik yap\u0131ld\u0131\u011f\u0131n\u0131 detayl\u0131ca inceleyelim.<\/p>\n<p>\u0130lk olarak a\u015fa\u011f\u0131daki tan\u0131mlanm\u0131\u015f enumeration\u0131 ele alal\u0131m;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public enum Yetkiler\r\n    {\r\n        Ekle = 1,\r\n        Sil = 2,\r\n        Guncelle = 4,\r\n        Listele = 8\r\n    }\r\n<\/pre>\n<p>Dikkat ederseniz e\u011fer her bir maddeye numara olarak iki ve ikinin katlar\u0131 verilmi\u015ftir. Bunun nedenini merak ederseniz e\u011fer a\u015fa\u011f\u0131daki kullan\u0131m tarz\u0131n\u0131 inceleyiniz;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Console.WriteLine(Yetkiler.Ekle | Yetkiler.Sil); \/\/3\r\n            Console.WriteLine(Yetkiler.Listele | Yetkiler.Guncelle); \/\/12\r\n            Console.WriteLine(Yetkiler.Guncelle | Yetkiler.Sil);  \/\/6\r\n            Console.WriteLine(Yetkiler.Ekle | Yetkiler.Guncelle); \/\/5\r\n<\/pre>\n<p>E\u011fer ki, enumeration \u00fczerinde &#8220;|&#8221; operat\u00f6r\u00fc ile i\u015flem yaparsak her iki maddenin say\u0131sal de\u011ferleri \u00fczerinde bir toplama i\u015flemi yapacakt\u0131r. Dolay\u0131s\u0131yla elde edilecek sonucun hangi de\u011ferlerin toplam\u0131n\u0131 verdi\u011fini anlayabilmek i\u00e7in herhangi iki de\u011ferin toplam sonucu bir \u00fc\u00e7\u00fcnc\u00fc de\u011ferin say\u0131sal de\u011ferinden farkl\u0131 olmas\u0131 gerekmektedir. \u0130\u015fte bu ihtiyaca d\u00f6n\u00fck tek ve garanti \u00e7\u00f6z\u00fcm enumeration de\u011ferlerini iki ve ikinin kat\u0131 olarak vermekten ge\u00e7er&#8230;<\/p>\n<p><strong>Peki hoca, bu toplam sonu\u00e7lar\u0131n\u0131n hangi de\u011ferlere kar\u015f\u0131l\u0131k geldi\u011fini nereden bilece\u011fiz?<\/strong> diye sordu\u011funuzu duyar gibiyim&#8230; Yani diyorsunuz ki; &#8220;3&#8221; de\u011ferini elde ediyorsam bunun &#8220;Ekle&#8221; ile &#8220;Sil&#8221; oldu\u011funu nereden anlayaca\u011f\u0131z&#8230;<br \/>\nAsl\u0131nda bu sorunun iki farkl\u0131 cevab\u0131 var diyebilirim. Birincisi; mevcut toplam\u0131 olu\u015fturabilecek say\u0131sal de\u011ferleri bir\u015fekilde tahmin etmekten ge\u00e7mektedir ki bu hem zor hemde l\u00fczumsuz yere bir maliyet gerektirmektedir. \u0130kincisi ise; as\u0131l konumuz olan ve basit ama olduk\u00e7a etkili y\u00f6ntem diyebilece\u011fimiz Flags attribute&#8217;unu kullanmakt\u0131r. Tabi ki de biz bu i\u00e7eri\u011fimizde birinci y\u00f6nteme zerre kadar de\u011finmeden direkt olarak ikinci y\u00f6ntemi ele almaya ba\u015flayaca\u011f\u0131z.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Flags]\r\n    public enum Yetkiler\r\n    {\r\n        Ekle = 1,\r\n        Sil = 2,\r\n        Guncelle = 4,\r\n        Listele = 8\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer enumeration\u0131m\u0131z\u0131 Flags attributeu ile i\u015faretlemi\u015f bulunmaktay\u0131z. Hal b\u00f6yleyken yine makalemizin \u00f6nceki sat\u0131rlar\u0131nda kulland\u0131\u011f\u0131m\u0131z y\u00f6ntemi tekrar tecr\u00fcbe edersek e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Console.WriteLine(Yetkiler.Ekle | Yetkiler.Sil); \/\/Ekle, Sil\r\n            Console.WriteLine(Yetkiler.Listele | Yetkiler.Guncelle); \/\/Listele, Guncelle\r\n            Console.WriteLine(Yetkiler.Guncelle | Yetkiler.Sil);  \/\/Guncelle, Sil\r\n            Console.WriteLine(Yetkiler.Ekle | Yetkiler.Guncelle); \/\/Ekle, Guncelle\r\n<\/pre>\n<p>g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere bu sefer toplam sonu\u00e7lar\u0131 nihayi sonuca denk gelebilecek olan maddeleri direkt olarak bizlere getirmektedir.<br \/>\nHarika de\u011fil mi?<\/p>\n<p>Bu \u015fekilde bir nesneye, alana, de\u011fi\u015fkene yahut kullan\u0131c\u0131ya birden fazla de\u011feri verebiliriz ve bunu tek bir enumeration \u00fczerinden ger\u00e7ekle\u015ftiriyor olabiliriz&#8230;<\/p>\n<p><strong>Peki hoca, elde edilen bu sonucu elimizdeki mevcut enumeration de\u011ferleriyle nas\u0131l k\u0131yaslayaca\u011f\u0131z?<\/strong> sorunuza kar\u015f\u0131l\u0131k ise a\u015fa\u011f\u0131daki kod blo\u011fu yeterince tatmin edici bir cevap olacakt\u0131r&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Yetkiler yetki = Yetkiler.Ekle | Yetkiler.Listele;\r\n            Console.WriteLine(yetki.HasFlag(Yetkiler.Ekle)); \/\/True\r\n            Console.WriteLine(yetki.HasFlag(Yetkiler.Sil)); \/\/False\r\n            Console.WriteLine(yetki.HasFlag(Yetkiler.Listele)); \/\/True\r\n            Console.WriteLine(yetki.HasFlag(Yetkiler.Guncelle)); \/\/False\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8220;HasFlag&#8221; metodu sayesinde hangi de\u011ferlerin girildi\u011fini k\u0131yaslayarak \u00f6\u011frenebilmekteyiz.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Enumeration, yap\u0131s\u0131 gere\u011fi bir veya birden fazla de\u011feri numaraland\u0131rmak ve bu atanan numaralar \u00fczerinden i\u015flem yapmak i\u00e7in kullan\u0131lan bir ara\u00e7t\u0131r. Kullan\u0131m olarak bir\u00e7ok varyasyonu bulunsada bunlar aras\u0131nda ama\u00e7sal olarak di\u011ferlerinden farkl\u0131l\u0131k g\u00f6stermeyen lakin&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3014,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[2738,2735,2736,2737,2734],"class_list":["post-10190","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-c-enumeration","tag-c-flags","tag-c-flags-attribute","tag-enumeration-flags","tag-flags-attribute"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/10190","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=10190"}],"version-history":[{"count":13,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/10190\/revisions"}],"predecessor-version":[{"id":10203,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/10190\/revisions\/10203"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3014"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=10190"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=10190"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=10190"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}