<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5476211391488527281</id><updated>2026-08-11T09:43:44.884+03:00</updated><category term="Programlama"/><category term="C#"/><category term="Object Oriented Programming"/><category term="Design Pattern"/><category term="Yazılar"/><category term="Duyurular"/><category term="Günlüklerim"/><category term="Haberler"/><category term="Generic"/><category term="SEO Dersleri"/><category term="Delegate"/><category term="Advanced C# Language Features"/><category term="Generic Collections"/><category term="Event"/><category term="Java"/><category term="Şarkılar"/><category term="Anonymous Methods"/><category term="Google Reklamcılık"/><category term="IEnumerable"/><category term="IEnumerator"/><category term="JPA"/><category term="Abstract Factory Pattern"/><category term="Abstract Factory Tasarım Deseni"/><category term="Adapter Pattern"/><category term="Adapter Tasarım Deseni"/><category term="Anonymous Type"/><category term="Bridge Pattern"/><category term="Bridge Tasarım Deseni"/><category term="Builder Pattern"/><category term="Builder Tasarım Deseni"/><category term="Chain of Responsibility Pattern"/><category term="Chain of Responsibility Tasarım Deseni"/><category term="Collections ObjectModel"/><category term="Command Pattern"/><category term="Command Tasarım Deseni"/><category term="Composite Pattern"/><category term="Composite Tasarım Deseni"/><category term="Decorator Pattern"/><category term="Decorator Tasarım Deseni"/><category term="Explicit Conversions"/><category term="Extension Methods"/><category term="Facade Pattern"/><category term="Facade Tasarım Deseni"/><category term="Factory Method Pattern"/><category term="Factory Method Tasarım Deseni"/><category term="Flyweight Pattern"/><category term="Flyweight Tasarım Deseni"/><category term="Generic Class"/><category term="IClonable"/><category term="IComparer"/><category term="IComperable"/><category term="Implicit Conversions"/><category term="Indexer Methods"/><category term="Interpreter Pattern"/><category term="Interpreter Tasarım Deseni"/><category term="Iterasyon"/><category term="Iterator Pattern"/><category term="Iterator Tasarım Deseni"/><category term="Lambda Expressions"/><category term="Lazy Object Instantiation"/><category term="Mediator Pattern"/><category term="Mediator Tasarım Deseni"/><category term="Memento Pattern"/><category term="Memento Tasarım Deseni"/><category term="ObservableCollection"/><category term="Observer  Pattern"/><category term="Observer Tasarım Deseni"/><category term="Operator Overloading"/><category term="Prototype Pattern"/><category term="Prototype Tasarım Deseni"/><category term="Proxy Pattern"/><category term="Proxy Tasarım Deseni"/><category term="Queue"/><category term="Singleton Pattern"/><category term="Singleton Tasarım Deseni"/><category term="SortedSet"/><category term="Stack"/><category term="State Pattern"/><category term="State Tasarım Deseni"/><category term="Strategy Pattern"/><category term="Strategy Tasarım Deseni"/><category term="Template Method Pattern"/><category term="Template Method Tasarım Deseni"/><category term="Visitor Pattern"/><category term="Visitor Tasarım Deseni"/><category term="Yield"/><category term="Şiir"/><title type='text'>Şafak Ünel (Matematik Mühendisi)</title><subtitle type='html'>Java, .Net ve Kişisel Blog Yazılarım</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Şafak ÜNEL</name><uri>http://www.blogger.com/profile/09759598266736974032</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVPzVRDx2frNA9eKaLDZQg5NUzpIp9FKOAm1JQGQ8jWpxMH4iYDTbaxRwUztm7Grvc4_Ws9t6hbVCpqZQMmhHVz03naDepgM1_uOAII7G78XeWcG1XP80-Fh1vqFcmUks/s1600-r/n719312546_464452_1486.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>165</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-6951938293832507275</id><published>2013-12-16T12:27:00.000+02:00</published><updated>2013-12-16T12:27:34.330+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Advanced C# Language Features"/><category scheme="http://www.blogger.com/atom/ns#" term="Anonymous Type"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Anonymous Type Kullanımı</title><content type='html'>Bir sınıf tanımladığımızda bu sınıfı programımızın bir çok yerinden çağırılmasını bekleriz. Peki sadece belli bir scope içerisinde sadece 1 kere kullanacağımız bir model gerekiyorsa ne yaparız? Sadece 1 kere kullanacak olmamıza rağmen yeni sınıf oluşturmak ne kadar mantıklı? Tabi ki mantıklı değil bu tip durumlarda &lt;b&gt;Anonymous Type&lt;/b&gt; kullanabiliriz.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Anonymous Type&lt;/b&gt;&amp;nbsp;tanımı yapılırken&amp;nbsp;&lt;b&gt;var&amp;nbsp;&lt;/b&gt;keyword&#39;ü kullanılır. Çünkü bildiğiniz gibi var ile bir değişken tanımlandığında tipi runtime&#39;da compiler tarafından belirlenir.&amp;nbsp;&lt;b&gt;Anonymous Type&lt;/b&gt;&amp;nbsp;olarak tanıladığımız tiplerin belirli bir tipi olmadığı için&amp;nbsp;&lt;b&gt;var&amp;nbsp;&lt;/b&gt;ile kullanılır.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    class Program
    {
        static void Main(string[] args)
        {
            BuildAnonymousType(&quot;Safak&quot;, &quot;Unel&quot;, 26);
            Console.ReadLine();
        }

        static void BuildAnonymousType(string name, string surname, int age)
        {
            // Build anon type using incoming args.
            // Anonymous Type tanimi yapiliyor
            // new&#39;den sonra isim verilmeden property&#39;ler tanimlaniyor
            var person = new { Name = name, Surname = surname, Age = age };

            // Note you can now use this type to get the property data!
            Console.WriteLine(&quot;Fullname: {0} Age: {1}\n&quot;,
            person.Name + &quot; &quot; + person.Surname, person.Age);

            // Anon types have custom implementations of each virtual
            // method of System.Object. For example:
            Console.WriteLine(&quot;ToString() == {0}&quot;, person.ToString());
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Yukarıda gördüğünüz gibi Person sınıfı oluşturmak yerine&amp;nbsp;&lt;b&gt;Anonymous Type&lt;/b&gt;&amp;nbsp;ile person nesnesi yarattık, ardından yarattığımız&amp;nbsp;&lt;b&gt;Anonymous Type&lt;/b&gt;&amp;nbsp;nesnesinin property&#39;lerine metod içerisinde ulaşabildik.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVtP_odQ8WCuxuA3cDw4ot2Q4k2mv5P0yBYXghSbLaeNb6ILM8JvEhmu2pvaY0hOg3KGEcQac1kzd7i4GtA4dQ9SC38_l-Devc3epZPqg5A03Q3I3Ys_Ip8MsK8AoVyLHQIPWG6b1qcVw/s1600/anonymous_types_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVtP_odQ8WCuxuA3cDw4ot2Q4k2mv5P0yBYXghSbLaeNb6ILM8JvEhmu2pvaY0hOg3KGEcQac1kzd7i4GtA4dQ9SC38_l-Devc3epZPqg5A03Q3I3Ys_Ip8MsK8AoVyLHQIPWG6b1qcVw/s1600/anonymous_types_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Anonymous Type tanımlanırken dikkat edilmesi gereken bir konu, &lt;b&gt;Anonymous Type&lt;/b&gt; propertyleri default construtor ile tanımlanır ve &lt;b&gt;readonly&lt;/b&gt;&#39;dirler sonradan değiştirilemezler.&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt; 
            person.Name = &quot;Ahmet&quot;;
&lt;/pre&gt;
&lt;br /&gt;
Yarattığımız person nesnesinin Name alanını sonradan yukarıdaki gibi Ahmet&#39;e çevirmek istersek readonly olduğu için aşağıdaki hatayı verecektir.&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;color: red;&quot;&gt;Property or indexer &#39;AnonymousType#1.Name&#39; cannot be assigned to -- it is read only&lt;/span&gt;&lt;/blockquote&gt;
Peki bu yarattığımız Anonymous Type nesnesini compiler nası yoruluyor hangi tipe çeviriyor? Bunu görmek için şu kod parçasını yazıp çalıştıralım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt; 
        static void ReflectOverAnonymousType(object obj)
        {
            Console.WriteLine(&quot;obj is an instance of: {0}&quot;, obj.GetType().Name);
            Console.WriteLine(&quot;Base class of {0} is {1}&quot;,
              obj.GetType().Name,
              obj.GetType().BaseType);
            Console.WriteLine(&quot;obj.ToString() == {0}&quot;, obj.ToString());
            Console.WriteLine(&quot;obj.GetHashCode() == {0}&quot;, obj.GetHashCode());
            Console.WriteLine();
        }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh587VMKFQhU6e74cumXgCWYCM_zrbQbVqoyGz2es4ylBZ9Y0jmSFD3YJGL_z_9S9Xxopgtlz3o2IKjPoc3UE_0AMvltm3xTN2cOjlgbaihR_XdLTKGGzSoyjZWUkNkDNqjiuNbWDY34d0/s1600/anonymous_types_ss1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh587VMKFQhU6e74cumXgCWYCM_zrbQbVqoyGz2es4ylBZ9Y0jmSFD3YJGL_z_9S9Xxopgtlz3o2IKjPoc3UE_0AMvltm3xTN2cOjlgbaihR_XdLTKGGzSoyjZWUkNkDNqjiuNbWDY34d0/s1600/anonymous_types_ss1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Gördüğünüz gibi compiler arka tarafta &lt;b&gt;System.Object&lt;/b&gt; sınıfından türeyen &lt;b&gt;&amp;lt;&amp;gt;f__AnonymousType0&lt;/b&gt; isminde bir sınıf yaratmış. Programımızı ildasm ile açarsanız bu sınıfın &lt;b&gt;sealed &lt;/b&gt;bir sınıf olduğunu görürsünüz. Ayrıca belirttiğimiz tüm Property&#39;lerin bu sınıf içerisinde &lt;b&gt;readonly &lt;/b&gt;olarak yaratılmış olduğunu göreceksiniz. Bu yüzden construtor dışında bu property&#39;leri değiştiremiyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&amp;lt;&amp;gt;f__AnonymousType0&lt;/b&gt; siz kendi programınızda baktığınızda farklı olabilir. Çünkü compiler çalışma zamanında oluşturduğu bu sınıfa unique bir isim vermektedir.&lt;br /&gt;
&lt;br /&gt;
Son olarak aşağıdaki gibi 2 Anonymous Type tanımladığımızı düşünelim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;            var p1 = new { Name = &quot;Safak&quot;, Surname = &quot;Unel&quot;, Age = 26 };
            var p2 = new { Name = &quot;Ahmet&quot;, Surname = &quot;Mehmet&quot;, Age = 22 };
&lt;/pre&gt;
&lt;br /&gt;
Compiler bu iki nesne için oluşturduğu tek &lt;b&gt;&amp;lt;&amp;gt;f__AnonymousType0&lt;/b&gt; sınıfını kullanacaktır. Her nesne için ayrı sınıf oluşturmayacaktır. Property&#39;leri aynı olan Anonymous Type nesneleri için tek bir sealed sınıf oluşturulup kullanılmaktadır.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Örnek Proje:&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/AnonymousTypeExample.rar&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;AnonymousTypeExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/6951938293832507275/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-anonymous-type-kullanimi.html#comment-form' title='2 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/6951938293832507275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/6951938293832507275'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-anonymous-type-kullanimi.html' title='C# Anonymous Type Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVtP_odQ8WCuxuA3cDw4ot2Q4k2mv5P0yBYXghSbLaeNb6ILM8JvEhmu2pvaY0hOg3KGEcQac1kzd7i4GtA4dQ9SC38_l-Devc3epZPqg5A03Q3I3Ys_Ip8MsK8AoVyLHQIPWG6b1qcVw/s72-c/anonymous_types_ss.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-2680840021045276110</id><published>2013-12-15T22:17:00.001+02:00</published><updated>2013-12-15T22:17:29.423+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Advanced C# Language Features"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Explicit Conversions"/><category scheme="http://www.blogger.com/atom/ns#" term="Implicit Conversions"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Implicit, Explicit Conversions Kullanımı</title><content type='html'>Programlarınızı yazarken bir çok kez bir tipten diğer tipe çevirim yapmışsınızdır. Bu çevrimlere örnek verirsek &lt;b&gt;long tipinden int tipine&lt;/b&gt;, &lt;b&gt;object tipinden string tipine&lt;/b&gt; gibi. Bu çevrimler sırasında daha geniş olan örneğin long&#39;tan int&#39;e çevrim yaparken data kaybı yaşanabilir. Ama int&#39;i long&#39;a çevririsek bu data kaybı yaşanmaz.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrqm1V7rTjXsQuYd8P2ECLN3GeXE3z-0nA4y6XzxqNMMTfqoT4vJc2RrVg6yLk1Vetu0wTn7rXbSKp4qUnjxaj4VE_m1iPYtJdC5ExtxuZa8RjEVOO-UrXQaYHv8DidTsjAieqVvkI2KM/s1600/Casting.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrqm1V7rTjXsQuYd8P2ECLN3GeXE3z-0nA4y6XzxqNMMTfqoT4vJc2RrVg6yLk1Vetu0wTn7rXbSKp4qUnjxaj4VE_m1iPYtJdC5ExtxuZa8RjEVOO-UrXQaYHv8DidTsjAieqVvkI2KM/s1600/Casting.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Data kaybı yaşanmayan çevrim&amp;nbsp;&lt;b&gt;Implicit&lt;/b&gt;, data kaybı yaşanabilecek çevrim ise&amp;nbsp;&lt;b&gt;Explicit &lt;/b&gt;olarak adlandırabiliriz.&amp;nbsp;&lt;b&gt;Implicit Conversation &lt;/b&gt;aritmetik operatörler ile yapılır bir cast operatörü içermez.&amp;nbsp;&lt;b&gt;Explicit Conversation &lt;/b&gt;ise cast operatörü ile yapılan coversion işlemidir.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;            int a = 123;
            long b = a; // Implicit conversion from int to long.
            int c = (int)b; // Explicit conversion from long to int.
&lt;/pre&gt;
&lt;br /&gt;
Aynı zamanda custom sınıflarımız içerisinde &lt;b&gt;Base&lt;/b&gt;, &lt;b&gt;Derived &lt;/b&gt;ilişkisi içerisinde bu çevrimler yapılabilir.
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    class Base { }
    class Derived : Base { }
    class Program
    {
        static void Main(string[] args)
        {
            // Implicit: derived to base.
            Base myBaseType;
            myBaseType = new Derived();
            // Must explicitly cast to store base reference
            // in derived type.
            Derived myDerivedType = (Derived)myBaseType;
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Peki custom sınıflarımız arasında &lt;b&gt;Base&lt;/b&gt;, &lt;b&gt;Derived &lt;/b&gt;ilişkisi olmadığı halde iki farklı sınıf önerğini birbirlerine çevirmek istesek ne yapacağız? Örnek biraz saçma olsada öğrenmek için veriyorum. Dikdörtgen ve Cember sınıflarımız olsun.&amp;nbsp;Dikdörtgen&#39;i&amp;nbsp;cembere çevirmek istiyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public struct Square
    {
        public int Length { get; set; }
        public Square(int l)
            : this()
        {
            Length = l;
        }
        public void Draw()
        {
            for (int i = 0; i &amp;lt; Length; i++)
            {
                for (int j = 0; j &amp;lt; Length; j++)
                {
                    Console.Write(&quot;*&quot;);
                }
                Console.WriteLine();
            }
        }
        public override string ToString()
        { return string.Format(&quot;[Length = {0}]&quot;, Length); }
    }
    public struct Rectangle
    {
        public int Width { get; set; }
        public int Height { get; set; }
        public Rectangle(int w, int h)
            : this()
        {
            Width = w; Height = h;
        }
        public void Draw()
        {
            for (int i = 0; i &amp;lt; Height; i++)
            {
                for (int j = 0; j &amp;lt; Width; j++)
                {
                    Console.Write(&quot;*&quot;);
                }
                Console.WriteLine();
            }
        }
        public override string ToString()
        {
            return string.Format(&quot;[Width = {0}; Height = {1}]&quot;,
            Width, Height);
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Rectangle &lt;/b&gt;ve &lt;b&gt;Square &lt;/b&gt;adında 2 struct yapısı tanımladık. Şimdi bu 2 yapı arasında şöyle bir çevrim yapmak istesek:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;            Rectangle r = new Rectangle(15, 4);
            Square s = (Square)r;
&lt;/pre&gt;
&lt;br /&gt;
Rectangle nesnesini Square nesnesine çevirmeye çalıştık. Fakat bu 2 nesne arasında Base, Derived ilişkisi oladığı için aşağıdaki hatayı alacağız:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;color: red;&quot;&gt;Cannot convert type &#39;CustomTypeConversions.Rectangle&#39; to &#39;CustomTypeConversions.Square&#39;&lt;/span&gt;&lt;/blockquote&gt;
Compiler bize Rectangle&#39;ı Square&#39;e çeviremediğini belirten bir hata mesajı verdi. Peki bunu custom bir şekilde nasıl yapabiliriz şimdi buna bakalım. C#&#39;ta custom çevrim işlemleri için kullanılan&amp;nbsp;&lt;b&gt;explicit&lt;/b&gt;,&amp;nbsp;&lt;b&gt;implicit &lt;/b&gt;keywordleri vardır.&lt;br /&gt;
&lt;br /&gt;
Yukarıdaki çevrim&amp;nbsp;&lt;b&gt;explicit &lt;/b&gt;bir çevrim olduğu için explicit keywordunu şu şekilde kullanarak hata almadan çevrim işlemini gerçekleştirebiliriz. Aşağıdaki kodu &lt;b&gt;Square &lt;/b&gt;sınıfımıza eklersek:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        // Explicit: Rectangle&#39;in Height propertysini kullanarak
        // Square olusturuyor
        public static explicit operator Square(Rectangle r)
        {
            Square s = new Square();
            s.Length = r.Height;
            return s;
        }
&lt;/pre&gt;
&lt;br /&gt;
Artık
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;            Rectangle r = new Rectangle(15, 4);
            Square s = (Square)r;
&lt;/pre&gt;
&lt;br /&gt;
Bu kod hatasız bir şekilde çalışacak ve r Rectangle nesnesinin Height property değeri olan 4&#39;u kullanarak Length&#39;i 4 olan bir squere nesnesi çevrimi yapılacaktır. Gördüğünüz gibi explicit olarak Rectangle nesnesinden Square nesnesine çevrimi gerçekleştirdik.&lt;br /&gt;
&lt;br /&gt;
Aşağıdaki gibi istediğiniz gibi farklı çevrimlerde yazabilirsiniz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        // int tipini Square nesnesine çevirir
        // Example: Square s = (Square)90;
        public static explicit operator Square( int sideLength )
        {
            Square newSq = new Square();
            newSq.Length = sideLength;
            return newSq;
        }

        // Square nesnesini int tipini çevirir
        // Example: int a = (Square)s;
        public static explicit operator int( Square s )
        { return s.Length; }
&lt;/pre&gt;
&lt;br /&gt;
Peki şöyle bir çevrim yapmak istesek ne olacak?&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;            Square s3 = new Square();
            s3.Length = 83;

            // implicit cevrim
            Rectangle rect2 = s3;
&lt;/pre&gt;
&lt;br /&gt;
Bu durumda compiler yine hata verecektir. Çünkü yapmaya çalıştığımız çevrim implicit fakat biz Rectangle sınıfımıza implicit çevrimi nasıl yapacağını belirten bir şey yazmadık.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;color: red;&quot;&gt;Cannot implicitly convert type &#39;CustomTypeConversions.Square&#39; to &#39;CustomTypeConversions.Rectangle&#39;&lt;/span&gt;&lt;/blockquote&gt;
implicit işlemini yapmak için implicit keyword&#39;ünü kullanarak sınıfımıza bu çevrimi nasıl yapacağını söylememiz gerekiyor. Aşağıdaki kodu &lt;b&gt;Recangle &lt;/b&gt;sınıfımıza eklersek:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        // implicit cevrim Square to Rectangle
        public static implicit operator Rectangle(Square s)
        {
            return new Rectangle(s.Length + 10, s.Length + 5);
        }
&lt;/pre&gt;
Artık&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;            Square s3 = new Square();
            s3.Length = 83;

            // implicit cevrim
            Rectangle rect2 = s3;
&lt;/pre&gt;
&lt;br /&gt;
Bu kod hata almadan çalışacaktır. Bu şekilde implicit şekilde Squere nesnemizi Rectangle nesnemize çevirmeyi başardık.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Örnek Proje:&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/CustomTypeConversions.rar&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;CustomTypeConversions.rar&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/2680840021045276110/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-implicit-explicit-conversions-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/2680840021045276110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/2680840021045276110'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-implicit-explicit-conversions-kullanimi.html' title='C# Implicit, Explicit Conversions Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrqm1V7rTjXsQuYd8P2ECLN3GeXE3z-0nA4y6XzxqNMMTfqoT4vJc2RrVg6yLk1Vetu0wTn7rXbSKp4qUnjxaj4VE_m1iPYtJdC5ExtxuZa8RjEVOO-UrXQaYHv8DidTsjAieqVvkI2KM/s72-c/Casting.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-1875413661176111007</id><published>2013-12-15T22:17:00.000+02:00</published><updated>2013-12-15T22:17:19.376+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Advanced C# Language Features"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Extension Methods"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Extension Methods Kullanımı</title><content type='html'>&lt;b&gt;Extension metodlar&lt;/b&gt;.NET 3.5 ile hayatımıza girmiş bir kavramdır. Kısaca bir &lt;b&gt;sınıf &lt;/b&gt;veya &lt;b&gt;struct &lt;/b&gt;yapısını modifiye etmeden &lt;b&gt;yeni metodlar&lt;/b&gt; veya &lt;b&gt;property&#39;ler &lt;/b&gt;eklememize olanak sağlar.&lt;br /&gt;
&lt;br /&gt;
Örneğin production&#39;da çalışan ve bir çok farklı uygulamanın kullandığı bir sınıfa yeni bir metod eklenmeniz istendi. Ama bu metod sadece sizin üzerinizde çalıştığınız uygulama için gerekli ama diğer uygulamalar için gereksiz. Bu durumda ne yapabilirsiniz?&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Production&#39;da çalışan sınıfa istenilen metodu eklemek&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Aklımıza ilk gelen herhalde bu sınıfa istenilen metodu eklemek olacaktır. Fakat bu sınıf bir çok uygulama tarafından kullanıldığı için sizin üzerinde yapacağınız değişiklikler belkide diğer uygulamaların patlamasına neden olacaktır.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Yeni bir sınıf oluşturup bu sınıfı&amp;nbsp;production&#39;da çalışan&amp;nbsp;sınıftan türetmek&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Bu yöntem ile productionda çalışan sınıfı değiştirmemiş olacağız aslında mantıklı bir yaklaşım oldu fakat bu sefer elimizde 2 sınıf oldu. Bunun kontrolü, bakımı problem olacaktır. Ayrıca sınıfımız sealed sınıfta olabilir biliyorsunuz ki sealed sınıflardan inherit yapılamaz.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Bu iki yöntemde işimize yaramadı. Bu noktada extension metodlar yarımımıza koşuyor.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Extension metodlarla ilgili olarak;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Extension metodlar &lt;b&gt;static &lt;/b&gt;tanımlanmalıdır.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Extension metodların ilk parametresinin önünde&amp;nbsp;&lt;b&gt;this &lt;/b&gt;olmalıdır ve extend edilecek sınıf türü buraya yazılmalıdır. Bu extension metodun hangi sınıfı extend ettiğini belirtir.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
Şimdi object ve int sınıfları için 2 extension metod tanımı yapalım:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public static class MyExtensions
    {
        public static void DisplayObjectAssemblyInfo(this object obj)
        {
            Console.WriteLine(&quot;Obje Type: {0}, Assembly: \n&quot;
                , obj.GetType().Name, 
                Assembly.GetAssembly(obj.GetType()).GetName().Name);
        }

        public static int Square(this int i)
        {
            return i * i;
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;MyExtensions &lt;/b&gt;sınıfı içerisindeki &lt;b&gt;DisplayObjectAssemblyInfo &lt;/b&gt;object sınıfını extent ediyor bunu metodun ilk parametresindeki this&#39;ten sonra yazılan obje türünden anlıyoruz (this object obj). Square metodu ise int sınıfını extend ediyor.&lt;br /&gt;
&lt;br /&gt;
Extension metod tanımı yaptıktan sonra extend edilen tipin metodları arasına bu extension metod gelir.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDyNF-1oNoltW_kOTOzi_WlZOSXCa1PrOlYTW0PnyRh6oh75bHNvOSTUpNkxSf2DP75W8EpQaI04wzOgY2LOk1FbPurDO9UGCZanxZSBS6DDNuIkQKp_WRvWDjFUR7llRfNdCBJVKmdDw/s1600/extension_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;168&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDyNF-1oNoltW_kOTOzi_WlZOSXCa1PrOlYTW0PnyRh6oh75bHNvOSTUpNkxSf2DP75W8EpQaI04wzOgY2LOk1FbPurDO9UGCZanxZSBS6DDNuIkQKp_WRvWDjFUR7llRfNdCBJVKmdDw/s640/extension_ss.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Yukardaki resimde görüldüğü gibi &lt;b&gt;DisplayObjectAssemblyInfo &lt;/b&gt;artık obje tipindeki nesnelerin bir metodu olarak görünüyor.&lt;br /&gt;
&lt;br /&gt;
Resimde görüldüğü gibi extension metodları sınıfın kendi metodlarından ayırmak için Visual Studio unique bir ikon ile gösteriyor extension metodları ve açıklamasında da (extension) diye belirtiyor.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    class Program
    {
        static void Main(string[] args)
        {
            string test = &quot;Test Message&quot;;

            //string object tipinden türediği için
            //DisplayObjectAssemblyInfo extension metodunu
            //kullanabiliriz.
            test.DisplayObjectAssemblyInfo();

            //int tipi için tanimladığımız
            //Square extension metodunu kullaniyoruz
            int i = 22;
            int square = i.Square();
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi artık tanımladığımız extension metodları kullanabiliyoruz.&lt;br /&gt;
&lt;br /&gt;
Interface&#39;lere extension metodlar yazılabilir. Örneğin aşağıdaki gibi bir yazım yapılabilir:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        public static void ShowItems(&lt;/pre&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;               this System.Collections.IEnumerable iterator)
        {
            foreach (var item in iterator)
            {
                Console.WriteLine(item);
            }
        }
&lt;/pre&gt;
&lt;br /&gt;
Bu extension metodun ardından artık &lt;b&gt;IEnumerable &lt;/b&gt;interface&#39;ini implement eden Array,List&amp;lt;T&amp;gt; gibi collection nesneleri &amp;nbsp;ShowItems metodunu kullanabilir hale geldi.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Örnek Proje:&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/ExtensionMethodsExample.rar&quot;&gt;ExtensionMethodsExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/1875413661176111007/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-extension-methods-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/1875413661176111007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/1875413661176111007'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-extension-methods-kullanimi.html' title='C# Extension Methods Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDyNF-1oNoltW_kOTOzi_WlZOSXCa1PrOlYTW0PnyRh6oh75bHNvOSTUpNkxSf2DP75W8EpQaI04wzOgY2LOk1FbPurDO9UGCZanxZSBS6DDNuIkQKp_WRvWDjFUR7llRfNdCBJVKmdDw/s72-c/extension_ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-721919862289198333</id><published>2013-12-15T18:01:00.000+02:00</published><updated>2013-12-15T18:01:47.290+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Advanced C# Language Features"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Operator Overloading"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Operator Overloading Kullanımı</title><content type='html'>Tüm programlama dillerinde olduğu gibi C#&#39;ta da belli &lt;b&gt;operatörler &lt;/b&gt;ile kolaylıkla işlemler yapılabilir. Örneğin&amp;nbsp;+ ile int tipindeki 2 elemanı matematiksel olarak toplayabiliriz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    int a = 100;
    int b = 240;
    int c = a + b; // c artik 340
&lt;/pre&gt;
&lt;br /&gt;
Görüldüğü gibi a ve b&amp;nbsp;+ operatörü ile matematiksel olarak toplanıp c değişkenine atandı. Peki a ve b int değilde string tipinde olsaydı?&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    string a= &quot;Hello&quot;;
    string b= &quot; world!&quot;;
    string c = a + b; // c artik &quot;Hello world!&quot;
&lt;/pre&gt;
&lt;br /&gt;
Buradan da görüldüğü gibi artık&amp;nbsp;+ operatörü matematiksel toplam yerine stringleri birleştirmek için kullanıldı. Yani her tip için operatörler farklı anlamlara gelebiliyor. Peki biz kendi yazdığımız tipler için&amp;nbsp;+,- gibi operatörlere anlamlar kazandırabilir miyiz? Evet, &lt;b&gt;Operator Overloading&lt;/b&gt;&amp;nbsp;ile bunu yapabiliriz. Şimdi bunu nasıl gerçekleştirebiliriz bir örnek üzerinden bakalım. Point isminde bir sınıfımız olsun bu sınıf bir noktanın X,Y kordinatlarını tutyor olsun.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public class Point
    {
        public int X { get; set; }
        public int Y { get; set; }
        public Point(int xPos, int yPos)
        {
            X = xPos;
            Y = yPos;
        }
        public override string ToString()
        {
            return string.Format(&quot;[{0}, {1}]&quot;, this.X, this.Y);
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Şimdi Point sınıfımızdan oluşturduğumuz p1 ve p2 nesne örneklerini + operatörü ile toplamaya çalışalım ne sonuç çıkacak?&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    class Program
    {
        static void Main(string[] args)
        {
            Point p1 = new Point(10,3);
            Point p2 = new Point(7, 4);

            //p1+p2 toplamak istiyoruz
            Point p3 = p1 + p2;

            Console.WriteLine(p3);
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Bu durumda hata alacağız. Çünkü Point sınıfımız için tanımlanmış bir&amp;nbsp;+ operatörü yok.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;color: red;&quot;&gt;Operator &#39;+&#39; cannot be applied to operands of type &#39;OperatorOverloadingExample.Point&#39; and &#39;OperatorOverloadingExample.Point&#39;&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Şimdi operatör tanımlarımız ile Point sınıfımızı yeniden tasarlayalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public class Point
    {
        public int X { get; set; }
        public int Y { get; set; }
        public Point(int xPos, int yPos)
        {
            X = xPos;
            Y = yPos;
        }
        public override string ToString()
        {
            return string.Format(&quot;[{0}, {1}]&quot;, this.X, this.Y);
        }

        //+ operatörü overload edildi
        //artık + ile 2 point nesnesinin X,Y değerleri toplanıp
        //yeni bir Point nesnesi döndürüyor
        public static Point operator + (Point p1, Point p2)
        {
            return new Point(p1.X + p2.Y, p1.Y + p2.X);
        }

        //+ operatörü overload edildi
        //artık + ile 2 point nesnesinin X,Y değerleri çıkarılıp
        //yeni bir Point nesnesi döndürüyor
        public static Point operator - (Point p1, Point p2)
        {
            return new Point(p1.X- p2.X, p1.Y -p2.Y);
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi artık&amp;nbsp;+ ve - operatörlerini Point sınıfımız için tanımladık artık programımız hata almadan çalışaktır.&amp;nbsp;+ operatörü artık gönderilen 2 point nesnesinin X ve Y koordinatlarını toplayıp yeni bir Point nesnesi döndürüyor. - operatörü ise gönderilen 2 point nesnesinin X ve Y koordinatlarını çıkartıp yeni bir Point nesnesi döndürüyor.&lt;br /&gt;
&lt;br /&gt;
Bu durumda programımızın çıktısı şöyle olacaktır:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinj1-PZ6dxuAOklBhqWrPyv7TLp2D7AR1kTiuceAHPO84hXKMY9Oj9IjI3wlfQJG-HkTknj4lwkITEGwsdqOeIoH2LEJ7BJZUokwM50NknnnbJ9AY5dK0a5tyG42GZZln6-Y8Ge2KiUKE/s1600/operator_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinj1-PZ6dxuAOklBhqWrPyv7TLp2D7AR1kTiuceAHPO84hXKMY9Oj9IjI3wlfQJG-HkTknj4lwkITEGwsdqOeIoH2LEJ7BJZUokwM50NknnnbJ9AY5dK0a5tyG42GZZln6-Y8Ge2KiUKE/s1600/operator_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Farklı olarak şu şekilde operatörler ekleyebiliriz sınıfımıza:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        // artik Point p2 = p1+5; şeklinde tanımlama yapılabilir.        
        public static Point operator +(Point p1, int change)
        {
            return new Point(p1.X + change, p1.Y + change);
        }
        //artik ++p1 şeklinde tanımlama yapilabilir.
        public static Point operator ++(Point p1)
        {
            return new Point(p1.X + 1, p1.Y + 1);
        }
        //ÖNEMLİ &quot;=&quot; operatörü bu şekilde override edilir
        public override bool Equals(object o)
        {
            return o.ToString() == this.ToString();
        }

        //artik p1==p2 kontrolu yapilabilir
        public static bool operator ==(Point p1, Point p2)
        {
            return p1.Equals(p2);
        }
        //artik p1!=p2 kontrolu yapilabilir
        public static bool operator !=(Point p1, Point p2)
        {
            return !p1.Equals(p2);
        }
        
&lt;/pre&gt;
Peki -=,&amp;nbsp;+= gibi operatörlerini kullanmak için ne yapmamız lazım? Bunlar için ekstra bişi yapmamıza gerek yok bu operatörleri&amp;nbsp;+ ve - operatörlerini tanımladıysak kullanabiliriz.&lt;br /&gt;
&lt;br /&gt;
Şimdi birde &amp;lt;,&amp;gt; büyük küçük kontrollerini nasıl override edebiliriz ona bakalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    
   public class Point : IComparable&amp;lt;Point&amp;gt;
    {
        //..
        public int CompareTo(Point other)
        {
            if (this.X &amp;gt; other.X &amp;amp;&amp;amp; this.Y &amp;gt; other.Y)
                return 1;
            if (this.X &amp;lt; other.X &amp;amp;&amp;amp; this.Y &amp;lt; other.Y)
                return -1;
            else
                return 0;
        }
        public static bool operator &amp;lt;(Point p1, Point p2)
        { return (p1.CompareTo(p2) &amp;lt; 0); }
        public static bool operator &amp;gt;(Point p1, Point p2)
        { return (p1.CompareTo(p2) &amp;gt; 0); }
        public static bool operator &amp;lt;=(Point p1, Point p2)
        { return (p1.CompareTo(p2) &amp;lt;= 0); }
        public static bool operator &amp;gt;=(Point p1, Point p2)
        { return (p1.CompareTo(p2) &amp;gt;= 0); }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Override Edilebilen Operatörler:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Unary Operators&lt;/b&gt; :&amp;nbsp;+, -,! , ~, ++, --, true, false&lt;br /&gt;
&lt;b&gt;Binary Operators&lt;/b&gt; :&amp;nbsp;+, -, *, /, %, &amp;amp;, |, ^, &amp;lt;&amp;lt;, &amp;gt;&amp;gt;&lt;br /&gt;
&lt;b&gt;Comparison Operators&lt;/b&gt; :&amp;nbsp;==,!=, &amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Override Edilemeyen Operatörler:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;The [] Operator&lt;/b&gt; : []&lt;br /&gt;
&lt;b&gt;The () Operator&lt;/b&gt; :()&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Örnek Proje:&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/OperatorOverloadingExample.rar&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;OperatorOverloadingExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/721919862289198333/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-operator-overloading-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/721919862289198333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/721919862289198333'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-operator-overloading-kullanimi.html' title='C# Operator Overloading Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinj1-PZ6dxuAOklBhqWrPyv7TLp2D7AR1kTiuceAHPO84hXKMY9Oj9IjI3wlfQJG-HkTknj4lwkITEGwsdqOeIoH2LEJ7BJZUokwM50NknnnbJ9AY5dK0a5tyG42GZZln6-Y8Ge2KiUKE/s72-c/operator_ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-756153079761296334</id><published>2013-12-15T14:42:00.003+02:00</published><updated>2013-12-15T18:02:10.531+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Advanced C# Language Features"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Indexer Methods"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Indexer Methods Kullanımı</title><content type='html'>C#&#39;da standart array yapısında &lt;b&gt;index &lt;/b&gt;operatorünün &lt;b&gt;[]&lt;/b&gt; ile kullanıldığını biliyorsunuz. Örnek kullanım olarak dizinin n. index&#39;indeki elemanını &lt;b&gt;dizi[n]&lt;/b&gt; diye çekebiliyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        static void Main(string[] args)
        {
            int[] myInts = { 10, 9, 100, 432, 9874 };

            //myInts dizisi üzerinde [n] index operetoru
            //kullanilarak elemanlarina ulasiliyor
            for (int j = 0; j &amp;lt; myInts.Length; j++)
                Console.WriteLine(&quot;Index {0} = {1} &quot;, j, myInts[j]);
        }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Indexer Metodlar&lt;/b&gt; bu index yapısını kendi custom &lt;b&gt;class &lt;/b&gt;ve &lt;b&gt;structures &lt;/b&gt;yapılarımızda kullanabilmemizi sağlar. Örnek olarak Person nesnelerini tutan &lt;b&gt;PersonCollection &lt;/b&gt;isminde bir sınıf oluşturalım. Burada ihtiyacımız olan [] index operatörü ile PersonCollection içerisindeki Person nesnelerine ulaşmak. Bu ihtiyacımızı koda dökersek şöyle bir şey olmalı:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public class Person
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public int Age { get; set; }

        public override string ToString()
        {
            return string.Format(&quot;Name: {0} Surname: {1} Age: {2}&quot;
                , Name, Surname, Age);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            PersonCollection myPeople = new PersonCollection();

            //indexer operator ile yeni person 
            //nesneleri ekleyebiliyor olmaliyiz 
            myPeople[0] = new Person() 
                { Name = &quot;Safak&quot;, Surname = &quot;Unel&quot;, Age = 26 };

            //for ile index üzerinden gezebiliyor olmaliyiz
            for (int i = 0; i &amp;lt; myPeople.Count; i++)
            {
                Console.WriteLine(myPeople[i]);
            }

            Console.ReadLine();
        }

    }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi &lt;b&gt;PersonCollection &lt;/b&gt;nesnesini standart bir collection gibi indexer ile kullanmak istiyoruz. Bunun için PersonClollection classımızı şöyle tasarlamış olmalıyız:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public class PersonCollection : IEnumerable
    {
        private ArrayList arPeople = new ArrayList();
 
        //ÖNEMLİ!! bu sayede PersonCollection&#39;ı
        //index operatoru [] ile kullanabilecegiz
        public Person this[int index]
        {
            get { return (Person)arPeople[index]; }
            set { arPeople.Insert(index, value); }
        }

        public int Count
        {
            get { return arPeople.Count; }
        }

        public IEnumerator GetEnumerator()
        {
            return arPeople.GetEnumerator();
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
public &lt;b&gt;Person this[int index]&lt;/b&gt; satırı ile bu sınıfımıza indexer özelliği kazandırmış olduk. Artık PersonCollection&#39;ı index operatoru [] ile kullanabilecegiz. Her index PersonCollection içerisindeki arrPeople&amp;nbsp;ArrayList&#39;inin Person nesnelerini döndürür.&lt;br /&gt;
&lt;br /&gt;
Index&#39;in int değeri yerine kolon ismi gibi &lt;b&gt;string değerler ile index&lt;/b&gt; operatorü kullanarak collection içerisinden veri çekebiliyoruz. Peki bunu programımıza eklemek istesek nasıl yaparız. Demek istediğim &lt;b&gt;myPeople[0]&lt;/b&gt; yerine &lt;b&gt;myPeople[&quot;Safak&quot;] &lt;/b&gt;dediğimde collectionımız içerisindeki Safak isimli person nesnesini döndürmesini istiyoruz. Bunun için artık arPeople&#39;ı ArrayList yerine &lt;b&gt;Dictionary&amp;lt;TKey,TValue&amp;gt;&lt;/b&gt; tanımlamamız gerekir.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    class PersonDictionaryCollection:IEnumerable
    {
        private Dictionary&amp;lt;string, Person&amp;gt; arPeople&amp;nbsp;
                   = new Dictionary&amp;lt;string, Person&amp;gt;();
       //ÖNEMLİ!! artık isim üzerinden index
      //yapiliyor
        public Person this[string name]
        {
            get { return (Person)arPeople[name]; }
            set { arPeople[name] = value; }
        }

        public int Count
        {
            get { return arPeople.Count; }
        }

        public IEnumerator GetEnumerator()
        {
            return arPeople.GetEnumerator();
        }
    }&lt;/pre&gt;
&lt;br /&gt;
Artık şu şekilde kullanabiliriz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        static void Main(string[] args)
        {
            PersonDictionaryCollection myPeople 
                     = new PersonDictionaryCollection();

            //indexer operator ile yeni person 
            //nesneleri ekleyebiliyor olmaliyiz 
            myPeople[&quot;Safak&quot;] = new Person() 
                { Name = &quot;Safak&quot;, Surname = &quot;Unel&quot;, Age = 26 };

            //isim ile indexledigimiz icin isimden
            //Safak nesnesini buluyor
            Console.WriteLine(myPeople[&quot;Safak&quot;]);

            Console.ReadLine();
        }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtooQaAW4-DhubA_WYp8Zutj1T10BMHN9T5QOlD791rVOEquFq9b-yHig13wcAFW1hPte_BQSzAi9MLzKK01oyvLSDbQEaIbekCIJ9bWjqHM2WFCpaocXywS7MW01bnY7T2EgMGuq3T5E/s1600/indexer_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtooQaAW4-DhubA_WYp8Zutj1T10BMHN9T5QOlD791rVOEquFq9b-yHig13wcAFW1hPte_BQSzAi9MLzKK01oyvLSDbQEaIbekCIJ9bWjqHM2WFCpaocXywS7MW01bnY7T2EgMGuq3T5E/s1600/indexer_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Örnek Proje:&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/IndexerMethodsExample.rar&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;IndexerMethodsExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/756153079761296334/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-indexer-methods-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/756153079761296334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/756153079761296334'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-indexer-methods-kullanimi.html' title='C# Indexer Methods Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtooQaAW4-DhubA_WYp8Zutj1T10BMHN9T5QOlD791rVOEquFq9b-yHig13wcAFW1hPte_BQSzAi9MLzKK01oyvLSDbQEaIbekCIJ9bWjqHM2WFCpaocXywS7MW01bnY7T2EgMGuq3T5E/s72-c/indexer_ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-7880257868677612611</id><published>2013-12-15T02:42:00.001+02:00</published><updated>2013-12-15T02:42:28.016+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Anonymous Methods"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Delegate"/><category scheme="http://www.blogger.com/atom/ns#" term="Event"/><category scheme="http://www.blogger.com/atom/ns#" term="Lambda Expressions"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Lambda Expressions Kullanımı</title><content type='html'>&lt;a href=&quot;http://safakunel.blogspot.com/2013/12/c-anonymous-methods-isimsiz-metodlar-kullanimi.html&quot;&gt;C# Anonymous Methods (İsimsiz Metodlar) Kullanımı&lt;/a&gt; yazımızda isimsiz metodların kullanımından bahsetmiştik. Aslında Lambda Expressions isimsiz metod yaratmanın kısa yoludur.&lt;br /&gt;
&lt;br /&gt;
Lambda Expressions&#39;ı generic &lt;b&gt;List&amp;lt;T&amp;gt;&lt;/b&gt; sınıfının&amp;nbsp;&lt;b&gt;FindAll()&lt;/b&gt; metodu üzerinden incelemeye çalışalım.&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt; 
     // Method of the System.Collections.Generic.List&amp;lt;T&amp;gt; class.
     public List&amp;lt;T&amp;gt; FindAll(Predicate&amp;lt;T&amp;gt; match)&lt;/pre&gt;
&lt;br /&gt;
Yukarıda FindAll metodunun freamwork içerisindeki tanımlamasını görüyorsunuz. Gördüğünüz gibi FindAll&amp;nbsp;&lt;b&gt;Predicate&amp;lt;T&amp;gt; &lt;/b&gt;delegelesini parametre alıyor. &lt;b&gt;Predicate&amp;lt;T&amp;gt;&lt;/b&gt; delegesi bool döndüren ve bir parametre alan metodları saklayan generic bir parametredir. Freamwork içerisindeki tanımı şu şekildedir:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    // This delegate is used by FindAll() method
    // to extract out the subset.
    public delegate bool Predicate&amp;lt;T&amp;gt;(T obj);
&lt;/pre&gt;
&lt;br /&gt;
FindAll metodunu çalıştırdığımızda listemizin içerisindeki elemanlar sırasıyla Predicate&amp;lt;T&amp;gt; delegesinin tuttuğu metodlara gidecek ve geriye true yada false değeri dönecektir.&lt;br /&gt;
&lt;br /&gt;
Önce &lt;b&gt;klasik delege tanımı&lt;/b&gt; ile bir liste içerisindeki çift sayıları bulan programımızı yazalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    class Program
    {
        static void Main(string[] args)
        {
            TraditionalDelegateSyntax();
        }

        static void TraditionalDelegateSyntax()
        {
            List&amp;lt;int&amp;gt; numbers = new List&amp;lt;int&amp;gt;();
            numbers.AddRange(new int[] { 5, 7, 9, 14, 17, 2, 6 });

            //klasik delege tanimi ile
            Predicate&amp;lt;int&amp;gt; predicate = new Predicate&amp;lt;int&amp;gt;(IsEvenNumber);
            List&amp;lt;int&amp;gt; evenNumbers = numbers.FindAll(predicate);

            foreach (int item in evenNumbers)
            {
                Console.WriteLine(item);
            }

            Console.ReadLine();
        }

        // Target for the Predicate&amp;lt;&amp;gt; delegate.
        static bool IsEvenNumber(int i)
        {
            // Is it an even number?
            return (i % 2) == 0;
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi önce Predicate&amp;lt;int&amp;gt; tipinde bir delege nesnesi tanımladık. Ardından IsEvenNumber metodunu bu delegenin saklayacağı metod olarak parametre verdik. Ardından FindAll metodu ile bu delegenin taşıdığı IsEvenNumber metodunu number listemizin her adımı için çalıştırdık. Klasik yöntem ile bu şekilde FindAll metodunu çalıştırabiliriz. Şimdi birde aynı örneği &lt;b&gt;Anonymous Methods&lt;/b&gt; ile yazalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        static void AnonymousMethodsDelegateSyntax()
        {
            List&amp;lt;int&amp;gt; numbers = new List&amp;lt;int&amp;gt;();
            numbers.AddRange(new int[] { 5, 7, 9, 14, 17, 2, 6 });

            //Anonymous Methods ile
            List&amp;lt;int&amp;gt; evenNumbers = numbers.FindAll(
                delegate(int i){ return (i % 2) == 0; }
                );

            foreach (int item in evenNumbers)
            {
                Console.WriteLine(item);
            }

            Console.ReadLine();
        }
&lt;/pre&gt;
&lt;br /&gt;
Bu şekilde isimsiz metodlar ile çift sayı bulma işlemini gerçekleştirmiş olduk. İsimsiz metodlar ile ilgili detaylı bilgiye şu yazıdan ulaşabilirsiniz: &lt;a href=&quot;http://safakunel.blogspot.com/2013/12/c-anonymous-methods-isimsiz-metodlar-kullanimi.html&quot;&gt;C# Anonymous Methods (İsimsiz Metodlar) Kullanımı&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Son olarak&amp;nbsp;&lt;b&gt;Lambda Expressions&lt;/b&gt; ile yazımına bakalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        static void LambdaExpressionsSyntax()
        {
            List&amp;lt;int&amp;gt; numbers = new List&amp;lt;int&amp;gt;();
            numbers.AddRange(new int[] { 5, 7, 9, 14, 17, 2, 6 });

            //Lambda Expressions ile
            List&amp;lt;int&amp;gt; evenNumbers = numbers.FindAll(i =&amp;gt; i % 2 == 0);

            foreach (int item in evenNumbers)
            {
                Console.WriteLine(item);
            }

            Console.ReadLine();
        }&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi Lambda Expressions ile yazımı çok basit bir hale geldik. Compiler Lambda Expressions gördüğünde o satırı Anonymous Methods&#39;a çevirir ve öyle yorumlar. Örneğin yukarıdaki örneği ildasm exe ile açarsanız &lt;b&gt;Lambda Expressions içeren satırının Anonymous Methods&#39;a çevrildiğini görürsünüz&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;      List&amp;lt;int&amp;gt; evenNumbers = list.FindAll(delegate (int i)
      {
          return (i % 2) == 0;
      });&lt;/pre&gt;
&lt;br /&gt;
Lambda Expressions ile yazdığımız kod şu an sadece return işlemi yapıyor. Fakat biz &lt;b&gt;birden fazla işlemi burada yaptırabiliriz:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;      List&amp;lt;int&amp;gt; evenNumbers = list.FindAll((i) =&amp;gt;
      {
          Console.WriteLine(&quot;value of i is currently: {0}&quot;, i);
          bool isEven = ((i % 2) == 0);
          return isEven;
      });
&lt;/pre&gt;
&lt;br /&gt;
Eğer &lt;b&gt;hiç bir parametre gönderilmiyor ise&lt;/b&gt; metoda şu şekilde Lambda Expressions yazılır:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;       VerySimpleDelegate d = new VerySimpleDelegate( 
       () =&amp;gt; {return &quot;Enjoy your string!&quot;;} );
&lt;/pre&gt;
&lt;br /&gt;
Eğer &lt;b&gt;birden fazla parametre gönderiliyor ise&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;       VerySimpleDelegate d = new VerySimpleDelegate( 
       (msg, result) =&amp;gt; 
         {Console.WriteLine(&quot;Message: {0}, Result: {1}&quot;, msg, result);} );
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3P1hboaEgwj3uCnLTtfsSs0_fjcI6P6E5DJ3vfWA8hlAbFLjpU-KPWR_sJOGqQWvAr0u7KAPSZpTnWPR86PtmS4bFwUYzO5yV4DforFP2Hsa8-mWQpKl-xhM2Sv4KNQCn9RXKK9_c8B0/s1600/lamda_Ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3P1hboaEgwj3uCnLTtfsSs0_fjcI6P6E5DJ3vfWA8hlAbFLjpU-KPWR_sJOGqQWvAr0u7KAPSZpTnWPR86PtmS4bFwUYzO5yV4DforFP2Hsa8-mWQpKl-xhM2Sv4KNQCn9RXKK9_c8B0/s1600/lamda_Ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;
Örnek Proje:&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/LambdaExpressionsExample.rar&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;LambdaExpressionsExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/7880257868677612611/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-lambda-expressions-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/7880257868677612611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/7880257868677612611'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-lambda-expressions-kullanimi.html' title='C# Lambda Expressions Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3P1hboaEgwj3uCnLTtfsSs0_fjcI6P6E5DJ3vfWA8hlAbFLjpU-KPWR_sJOGqQWvAr0u7KAPSZpTnWPR86PtmS4bFwUYzO5yV4DforFP2Hsa8-mWQpKl-xhM2Sv4KNQCn9RXKK9_c8B0/s72-c/lamda_Ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-6423140953734318075</id><published>2013-12-15T01:24:00.002+02:00</published><updated>2013-12-15T01:31:54.178+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Anonymous Methods"/><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Delegate"/><category scheme="http://www.blogger.com/atom/ns#" term="Event"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Anonymous Methods (İsimsiz Metodlar) Kullanımı</title><content type='html'>Önceki&amp;nbsp;&lt;a href=&quot;http://safakunel.blogspot.com/2013/12/c-delegate-kullanimi-delege-nedir.html&quot;&gt;C# Delegate Kullanımı I - Delege Nedir?&lt;/a&gt;&amp;nbsp;ve&amp;nbsp;&lt;a href=&quot;http://safakunel.blogspot.com/2013/12/c-delegate-kullanimi-generic-delegeler.html&quot;&gt;C# Delegate Kullanımı II - Generic Delegeler&lt;/a&gt;&amp;nbsp;yazılarımızda&amp;nbsp;&lt;b&gt;delege&amp;nbsp;&lt;/b&gt;kavramından bahsetmiştik. Bu yazılarımızda delege tanımlarını daha önce tanımlanmış olduğumuz named metodlar ile yaptık. C# 2.0 ile birlikte bunu &lt;b&gt;isimsiz metodlar&lt;/b&gt; ile yapabiliyor hale geldik.&lt;br /&gt;
&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;csharp&quot;&gt;
button1.Click += delegate
{
    MessageBox.Show(&quot;isimsiz metodumuz calisti&quot;);
};
&lt;/pre&gt;
&lt;br /&gt;
Önce daha önceki yazılarımızda&amp;nbsp;&lt;b&gt;named metodlar&lt;/b&gt; ile&amp;nbsp;yazdığımız delege örneğimizi hatırlayalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public class Person
    {
        public delegate void PersonChangeHandler(Person person
                    , string fieldName, string newValue);
        public event PersonChangeHandler PersonHasChanged;

        public int PersonId { get; set; }
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                //eger method set edildi ise
                if (PersonHasChanged != null)
                    PersonHasChanged(this, &quot;Name&quot;, value);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person() { PersonId = 1, Name = &quot;Safak&quot; };
            p1.PersonHasChanged += ShowChangedUser;
            p1.PersonHasChanged += SendChangedUserInformation;
            p1.Name = &quot;Test&quot;;

            Console.ReadLine();

        }

        static void ShowChangedUser(Person p, string fieldName
            , string newValue)
        {
            Console.WriteLine(@&quot;Person ID: {0} Field: {1} 
                    New Value: {2}&quot;, p.PersonId, fieldName, newValue);
        }

        static void SendChangedUserInformation(Person p, string fieldName
            , string newValue)
        {
            Console.WriteLine(@&quot;Person ID: {0} Bilgilendirme maili 
                    gonderiliyor&quot;, p.PersonId, fieldName, newValue);
        }
    }
&lt;/pre&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Şimdi bunu &lt;b&gt;anonymous methodlar&lt;/b&gt; ile nasıl yaparız ona bakalım:&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public class Person
    {
        public delegate void PersonChangeHandler(Person person
                    , string fieldName, string newValue);
        public event PersonChangeHandler PersonHasChanged;

        public int PersonId { get; set; }
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                //eger method set edildi ise
                if (PersonHasChanged != null)
                    PersonHasChanged(this, &quot;Name&quot;, value);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person() { PersonId = 1, Name = &quot;Safak&quot; };

            //ÖNEMLİ!! ShowChangedUser yerine isimsiz metod kullandik
            p1.PersonHasChanged += delegate(Person p, string fieldName
            , string newValue)
            {
                Console.WriteLine(@&quot;Person ID: {0} Field: {1}   
                    New Value: {2}&quot;, p.PersonId, fieldName, newValue);
            };

            //ÖNEMLİ!! SendChangedUserInformation yerine isimsiz metod kullandik
            p1.PersonHasChanged += delegate(Person p, string fieldName
            , string newValue)
            {
                Console.WriteLine(@&quot;Person ID: {0} Bilgilendirme maili   
                    gonderiliyor&quot;, p.PersonId, fieldName, newValue);
            };

            //ÖNEMLİ!! parametresiz isimsiz metodda kullanabiliriz
            p1.PersonHasChanged += delegate
            {
                Console.WriteLine(&quot;Degisiklik calisti.&quot;);
            };

            p1.Name = &quot;Test&quot;;

            Console.ReadLine();

        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi artık &lt;b&gt;ShowChangedUser &lt;/b&gt;ve &amp;nbsp;&lt;b&gt;SendChangedUserInformation &lt;/b&gt;named metodlarını kullanmadık onun yerine isimsiz metodlar ile delege tanımlarımızı gerçekleştirdik.&lt;br /&gt;
&lt;br /&gt;
Burda önemli noktalardan biri en son metod atama işleminde&lt;b&gt; parametresiz metod ataması yapabildik&lt;/b&gt;. Named metod kullansaydık buna izin verilmiyor olurdu. Çünkü named metod kullanımında metodun parametreleri ile delege tanımındaki parametrelerin uyuşması gerekmektedir.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBUlliJzsXOjBIksQrJR1PbjGgUsZADY3Ge4B8YgDeG4Mmg8TNz5hT1PafnNaL3-AZ73V3CekxqOOMoEREoXZVfkIlNaflcmkwl6tV3oynPBfZMENEbuD85-nFh7dG0KbN6x-fZrq-ywQ/s1600/isimsiz_metod_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBUlliJzsXOjBIksQrJR1PbjGgUsZADY3Ge4B8YgDeG4Mmg8TNz5hT1PafnNaL3-AZ73V3CekxqOOMoEREoXZVfkIlNaflcmkwl6tV3oynPBfZMENEbuD85-nFh7dG0KbN6x-fZrq-ywQ/s1600/isimsiz_metod_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
İsimsiz metodlar kod aşamasında isimsiz gözüksede derlenme aşamasında, &lt;b&gt;unique &lt;/b&gt;olarak isimlendirilmiş bir metoda dönüştürülür. &lt;b&gt;ildasm &lt;/b&gt;ile yazdığınız koda bakarsanız bunu açıkça görebilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Anonymous Methodlar:&lt;/b&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
* Anonymous methodlar, &lt;b&gt;delegate &lt;/b&gt;sözcüğüyle başlamak zorundadır.&lt;br /&gt;
* Herhangi bir türde &lt;b&gt;parametre &lt;/b&gt;kabul ettiklerini ederler. &lt;b&gt;ref &lt;/b&gt;ve &lt;b&gt;out &lt;/b&gt;sözcükleriyle birlikte de kullanılabilir.&lt;br /&gt;
* &lt;b&gt;params &lt;/b&gt;sözcüğü, anonymous metodlarda kullanılamaz.&lt;br /&gt;
* Tanımlandığı sınıf içerisindeki herhangi bir değişken ile aynı isme sahip değişkeni olamaz.&lt;br /&gt;
* Bir metoda parametre olarak gönderilebilir. Örnek:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        int[] CiftSayilar = Array.FindAll(Sayilar, delegate(int Sayi)
        {
           return (Sayi % 2 == 0);
        });
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Örnek Proje:
&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/AnonymousMethodsExample.rar&quot;&gt;AnonymousMethodsExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/6423140953734318075/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-anonymous-methods-isimsiz-metodlar-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/6423140953734318075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/6423140953734318075'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-anonymous-methods-isimsiz-metodlar-kullanimi.html' title='C# Anonymous Methods (İsimsiz Metodlar) Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBUlliJzsXOjBIksQrJR1PbjGgUsZADY3Ge4B8YgDeG4Mmg8TNz5hT1PafnNaL3-AZ73V3CekxqOOMoEREoXZVfkIlNaflcmkwl6tV3oynPBfZMENEbuD85-nFh7dG0KbN6x-fZrq-ywQ/s72-c/isimsiz_metod_ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-7372542133858714601</id><published>2013-12-15T00:22:00.001+02:00</published><updated>2013-12-15T00:52:27.876+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Delegate"/><category scheme="http://www.blogger.com/atom/ns#" term="Event"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Event Kullanımı II - Generic Events</title><content type='html'>&lt;a href=&quot;http://safakunel.blogspot.com/2013/12/c-event-kullanimi.html&quot;&gt;C# Event Kullanımı&lt;/a&gt; yazımızda event kavramına giriş yapmıştık. Bu yazımızda &lt;b&gt;generic event&lt;/b&gt; kavramını incelemeye çalışacağız.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;EventArgs &lt;/b&gt;sınıfından türeyen kendi custon EventArgs sınıfımızı yazabiliriz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public class CustomEventArgs : EventArgs
    {
        public int PersonId { get; set; }
        public string FieldName { get; set; }
        public string NewValue { get; set; }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CustomEventArgs &lt;/b&gt;sınıfımızı yazdıktan sonra artık delege tanımı yapmadan freamwork içerisinde event handle etmek için kullanılan &lt;b&gt;EventHandle&amp;lt;&amp;gt;&lt;/b&gt; generic sınıfını kullanarak programımızı yazabiliriz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    class Person
    {
        public event EventHandler&amp;lt;CustomEventArgs&amp;gt; PersonHasChanged;

        public int PersonId { get; set; }
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                //eger method set edildi ise
                if (PersonHasChanged != null)
                {
                    CustomEventArgs c = new CustomEventArgs();
                    c.PersonId = this.PersonId;
                    c.FieldName = &quot;Name&quot;;
                    c.NewValue = value;
                    PersonHasChanged(this, c);
                }
            }
        }

    }
    public class CustomEventArgs : EventArgs
    {
        public int PersonId { get; set; }
        public string FieldName { get; set; }
        public string NewValue { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person() { PersonId = 1, Name = &quot;Safak&quot; };
            p1.PersonHasChanged += ShowChangedUser;
            p1.PersonHasChanged += SendChangedUserInformation;
            p1.Name = &quot;Test&quot;;

            Console.ReadLine();

        }

        static void ShowChangedUser(object sender, CustomEventArgs e)
        {
            Console.WriteLine(@&quot;Person ID: {0} Field: {1} 
                    New Value: {2}&quot;, e.PersonId, e.FieldName, e.NewValue);
        }

        static void SendChangedUserInformation(object sender
                , CustomEventArgs e)
        {
            Console.WriteLine(@&quot;Person ID: {0} Bilgilendirme maili 
                    gonderiliyor&quot;, e.PersonId, e.FieldName, e.NewValue);
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLJ3jJBgj3AWV1S0wMj0AJDrUxBu4NF4rBdbFvHDvLMFmfQccUtpqpTSFD0lzSSah6Vx87KCMZS7y3wZ_tIhoNnKobxuQwZIyc5aOn2TPaIL5v5IWE26UQAGH3xN8bEI4CMSybIk724cs/s1600/event_ss1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLJ3jJBgj3AWV1S0wMj0AJDrUxBu4NF4rBdbFvHDvLMFmfQccUtpqpTSFD0lzSSah6Vx87KCMZS7y3wZ_tIhoNnKobxuQwZIyc5aOn2TPaIL5v5IWE26UQAGH3xN8bEI4CMSybIk724cs/s1600/event_ss1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/7372542133858714601/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-generic-event-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/7372542133858714601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/7372542133858714601'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-generic-event-kullanimi.html' title='C# Event Kullanımı II - Generic Events'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLJ3jJBgj3AWV1S0wMj0AJDrUxBu4NF4rBdbFvHDvLMFmfQccUtpqpTSFD0lzSSah6Vx87KCMZS7y3wZ_tIhoNnKobxuQwZIyc5aOn2TPaIL5v5IWE26UQAGH3xN8bEI4CMSybIk724cs/s72-c/event_ss1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-8154724906746786809</id><published>2013-12-14T23:40:00.002+02:00</published><updated>2013-12-15T00:51:55.951+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Delegate"/><category scheme="http://www.blogger.com/atom/ns#" term="Event"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Event Kullanımı I - Event Nedir?</title><content type='html'>Önceki &lt;a href=&quot;http://safakunel.blogspot.com/2013/12/c-delegate-kullanimi-delege-nedir.html&quot;&gt;C# Delegate Kullanımı I - Delege Nedir?&lt;/a&gt; ve&amp;nbsp;&lt;a href=&quot;http://safakunel.blogspot.com/2013/12/c-delegate-kullanimi-generic-delegeler.html&quot;&gt;C# Delegate Kullanımı II - Generic Delegeler&lt;/a&gt; yazılarımızda &lt;b&gt;delege &lt;/b&gt;kavramından bahsetmiştik. Kısacası delegeleri metot saklamak için kullandığımızı hatırlayalım.&lt;br /&gt;
&lt;br /&gt;
Bu yazıları okuduysanız ya da delegeler hakkında bilginiz var ise programlarımızda delege kullanacaksak bir çok tanımlama yapmamız gerekiyor: delege tanımlama, encapsule için custom register ve unregister metotları gibi.&lt;br /&gt;
&lt;br /&gt;
Şimdi düşünelim ki Person isminde bir sınıfımız var ve biz Person nesnesi üzerinde bir değişiklik yapılınca bir takım metodların çalışmasını istiyoruz. Bu durumda şöyle bir tasarım gerçekleştirebiliriz: bir delege tanımlarız ardından bu delegenin tutacağı metodları setlemek için bir metod yazarız ve bu sayede bir değişiklik olduğunda istediğimiz metodların çalışmasını sağlarız. Gördüğünüz gibi &lt;b&gt;event &lt;/b&gt;kullanmadan tasarımı gerçekleştirdik. Şimdi bunu koda dökelim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public class Person
    {
        public delegate void PersonChangeHandler(Person person
           , string fieldName
           , string newValue);
        private PersonChangeHandler PersonHasChanged;

        public void RegisterMethod(PersonChangeHandler methodToAdd)
        {
            PersonHasChanged += methodToAdd;
        }

        public void UnregisterRegisterMethod(PersonChangeHandler methodToAdd)
        {
            PersonHasChanged -= methodToAdd;
        }

        public int PersonId { get; set; }
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                //eger method set edildi ise
                if(PersonHasChanged != null)
                    PersonHasChanged(this, &quot;Name&quot;, value);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person() { PersonId = 1, Name = &quot;Safak&quot; };
            p1.RegisterMethods(ShowChangedUser);
            p1.RegisterMethods(SendChangedUserInformation);
            p1.Name = &quot;Test&quot;;

            Console.ReadLine();
        }

        static void ShowChangedUser(Person p, string fieldName
            , string newValue)
        {
            Console.WriteLine(@&quot;\nPerson ID: {0} Field: {1} 
                    New Value: {2}&quot;, p.PersonId, fieldName, newValue);
        }

        static void SendChangedUserInformation(Person p, string fieldName
            , string newValue)
        {
            Console.WriteLine(@&quot;Person ID: {0} Bilgilendirme maili 
                    gonderiliyor&quot;, p.PersonId, fieldName, newValue);
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga2ql2-W4IT2NdDL__n1OCqATjaCUvnl-Rsiz6hwup2bDzBk1bQvYS8xAG2wDwkeYkCtXX4n95rl_NrQxrx_8nhoyAg59bLmYtNrlEtAX0ahPa4Z9b9BbpIqHYzNpTnv-ajbUiNzzf0ww/s1600/event_ss1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;108&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga2ql2-W4IT2NdDL__n1OCqATjaCUvnl-Rsiz6hwup2bDzBk1bQvYS8xAG2wDwkeYkCtXX4n95rl_NrQxrx_8nhoyAg59bLmYtNrlEtAX0ahPa4Z9b9BbpIqHYzNpTnv-ajbUiNzzf0ww/s320/event_ss1.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gördüğünüz gibi PersonChangeHandler isminde bir delege tanımladık. Daha sonra Person sınıfımızın içerisine&amp;nbsp;PersonHasChanged isminde delege nesne örneği tanımladık. Ardından custom register ve unregister metodlarımızı yazdık. Burada PersonHasChanged delege nesne örneğinin private tanımlanması önemli çünkü bununla encapsule işlemini gerçekleştirmiş olduk. Client delege nesne örneğine direk ulaşamıyor ancak register ve unregister metodları ile delegeye yeni metodlar ekleyip çıkarabiliyor.&lt;br /&gt;
&lt;br /&gt;
Peki PersonHasChanged public olsaydı ne olurdu? Bu durumda artık custom register ve unregister metodları yazmamıza gerek kalmazdı. Yeni programımız şu şekilde olurdu:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public class Person
    {
        public delegate void PersonChangeHandler(Person person
           , string fieldName
           , string newValue);
        public PersonChangeHandler PersonHasChanged;

        public int PersonId { get; set; }
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                //eger method set edildi ise
                if(PersonHasChanged != null)
                    PersonHasChanged(this, &quot;Name&quot;, value);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person() { PersonId = 1, Name = &quot;Safak&quot; };
            p1.PersonHasChanged += ShowChangedUser;
            p1.PersonHasChanged += SendChangedUserInformation;
            p1.Name = &quot;Test&quot;;

            Console.ReadLine();
        }

        static void ShowChangedUser(Person p, string fieldName
            , string newValue)
        {
            Console.WriteLine(@&quot;\nPerson ID: {0} Field: {1} 
                    New Value: {2}&quot;, p.PersonId, fieldName, newValue);
        }

        static void SendChangedUserInformation(Person p, string fieldName
            , string newValue)
        {
            Console.WriteLine(@&quot;Person ID: {0} Bilgilendirme maili 
                    gonderiliyor&quot;, p.PersonId, fieldName, newValue);
        }
    }&lt;/pre&gt;
&lt;br /&gt;
Bu şekilde de programımız çalışacak ve aynı sonucu üretecektir. Fakat burada bir sorun var. Encapsule işlemi gerçekleştirmedik. Client direk olarak delege nesnesine ulaşabiliyor. Bu sayede artık clientin istediği gibi delegenin Invoke metodunu çalıştırma özgürlüğü var. Örneğin aşağıdaki kodu artık yazabilir:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;            p1.PersonHasChanged.Invoke(p1, &quot;hebele&quot;, &quot;hübele&quot;);
&lt;/pre&gt;
&lt;br /&gt;
Bu durumda çıktı:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkGqEd9alGkIND8XK3-WNmB3dO24I3oCSS0b0wiX-WyTHTwLN-ybUoy3jCvDYVrsoK76M2NKShk5NNOXPmX-MfgecElXCaYpnfBB3iU1CoezeEoMsq-0fdcNkjqR23bJUZMys04IHr6Q0/s1600/event_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkGqEd9alGkIND8XK3-WNmB3dO24I3oCSS0b0wiX-WyTHTwLN-ybUoy3jCvDYVrsoK76M2NKShk5NNOXPmX-MfgecElXCaYpnfBB3iU1CoezeEoMsq-0fdcNkjqR23bJUZMys04IHr6Q0/s1600/event_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Gördüğünüz gibi client gitti p1 nesnemizin sanki hebele diye bir alanı varmış gibi bunun değiştiğini belirtti ve metodların çalışmasına neden oldu. Bu önemli bir güvenlik açığı oldu programımız için. Peki ne yapabiliriz?&lt;br /&gt;
&lt;br /&gt;
Event kavramı tam burada ihtiyacımıza koşuyor.&amp;nbsp;&lt;b&gt;Eventlar, delegelerin encapsule edilmiş halidir.&lt;/b&gt; PersonHasChanged delege örneğini &lt;b&gt;event &lt;/b&gt;olarak tanımlasaydık hem custom &lt;b&gt;register ve unregister metodlarını yazmaktan kurtulurduk&lt;/b&gt; hem de yukarıda anlattığımız&lt;b&gt; public encapsule problemini&lt;/b&gt; yaşamazdık.&lt;br /&gt;
&lt;br /&gt;
Şimdi programımızı birde event ile yazalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;public class Person
    {
        public delegate void PersonChangeHandler(Person person
                    , string fieldName, string newValue);
        public event PersonChangeHandler PersonHasChanged;

        public int PersonId { get; set; }
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                //eger method set edildi ise
                if (PersonHasChanged != null)
                    PersonHasChanged(this, &quot;Name&quot;, value);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person() { PersonId = 1, Name = &quot;Safak&quot; };
            p1.PersonHasChanged += ShowChangedUser;
            p1.PersonHasChanged += SendChangedUserInformation;
            p1.Name = &quot;Test&quot;;

            Console.ReadLine();

        }

        static void ShowChangedUser(Person p, string fieldName
            , string newValue)
        {
            Console.WriteLine(@&quot;Person ID: {0} Field: {1} 
                    New Value: {2}&quot;, p.PersonId, fieldName, newValue);
        }

        static void SendChangedUserInformation(Person p, string fieldName
            , string newValue)
        {
            Console.WriteLine(@&quot;Person ID: {0} Bilgilendirme maili 
                    gonderiliyor&quot;, p.PersonId, fieldName, newValue);
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi hem &lt;b&gt;custom register ve unregister işlemlerinden kurtulduk&lt;/b&gt; hem de bu sayede event ile d&lt;b&gt;elegemiz encapsule olduğu için client Invoke metodunu kafasına göre çalıştıramadı&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
p1.PersonHasChanged&#39;ın sonuna nokta koyup metot listesine erişmeye çalışırsanız hiç bir metodun çıkmadığını görürsünüz.&lt;br /&gt;
&lt;br /&gt;
C# windows form uygulaması geliştirdiyseniz burada eventların bolca kullanıldığını görürsünüz. Buton click event&#39;ı gibi bir çok event bulunmakta. Konuyu daha iyi anlamak için bu eventları incelemenizi öneririm.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Örnek Projeler:&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/PublicDelegateProblem.rar&quot;&gt;PublicDelegateProblem.rar&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/EventDelegateExample.rar&quot;&gt;EventDelegateExample.rar&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/8154724906746786809/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-event-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/8154724906746786809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/8154724906746786809'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-event-kullanimi.html' title='C# Event Kullanımı I - Event Nedir?'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga2ql2-W4IT2NdDL__n1OCqATjaCUvnl-Rsiz6hwup2bDzBk1bQvYS8xAG2wDwkeYkCtXX4n95rl_NrQxrx_8nhoyAg59bLmYtNrlEtAX0ahPa4Z9b9BbpIqHYzNpTnv-ajbUiNzzf0ww/s72-c/event_ss1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-4151987462720389241</id><published>2013-12-12T23:58:00.001+02:00</published><updated>2013-12-14T23:42:54.919+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Delegate"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Delegate Kullanımı II - Generic Delegeler</title><content type='html'>&lt;a href=&quot;http://safakunel.blogspot.com/2013/12/c-delegate-kullanimi-delege-nedir.html&quot;&gt;C# Delegate Kullanımı I - Delege Nedir?&lt;/a&gt; yazımızda delege kavramını, ne işe yaradığını, nerelerde kullanıldığını incelemiştik.&lt;br /&gt;
&lt;br /&gt;
C#&amp;nbsp;&lt;b&gt;generic delege&lt;/b&gt; tanımlama yapmamıza olanak sağlar. Örneğin, void döndüren ve bir parametre alan 2 metodumuz olsun: &lt;b&gt;StringTarget&lt;/b&gt;; string tipinde parametre alıyor ve geriye void döndürüyor. &lt;b&gt;IntTarget &lt;/b&gt;ise int tipinde parametre alıyor ve o da geriye void döndürüyor.&lt;br /&gt;
&lt;br /&gt;
Normal şartlarda 2 delege tanımlamamız birine string parametresi diğerine int parametresi yazmamız gerekir. Şimdi ilk aklımıza gelen şekilde bu programı yazalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        delegate void MyStringDelegate(string args);
        delegate void MyIntDelegate(int args);

        static void Main(string[] args)
        {
            MyStringDelegate stringDelegate = new MyStringDelegate(StringTarget);
            MyIntDelegate intDelegate = new MyIntDelegate(IntTarget);

            stringDelegate(&quot;Safak&quot;);
            intDelegate(26);

            Console.ReadLine();
        }

        static void StringTarget(string arg)
        {
            Console.WriteLine(&quot;arg in uppercase is: {0}&quot;, arg.ToUpper());
        }
        static void IntTarget(int arg)
        {
            Console.WriteLine(&quot;++arg is: {0}&quot;, ++arg);
        }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi string tipinde parametre alan metodumuz için &lt;b&gt;MyStringDelegate&lt;/b&gt;, int tipinde parametre alan metodumuz için ise &lt;b&gt;MyIntDelegate &lt;/b&gt;delegesini tanımladık. Peki yine void döndüren fakat parametre olarak double alan bir metodu delege etmek istesek ne yapacağız? Bu durumda yeni bir &lt;b&gt;MyDoubleDelegate &lt;/b&gt;yazmamız gerekecek. Bu durumu ortadan kaldırmak için şimdi bu programı birde generic delege kullanarak yazalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt; 
        //generic delegate
        delegate void MyGenericDelegate&amp;lt;T&amp;gt;(T args);

        static void Main(string[] args)
        {
            //generic delegate
            MyGenericDelegate&amp;lt;string&amp;gt; stringDelegate 
                = new MyGenericDelegate&amp;lt;string&amp;gt;(StringTarget);
            MyGenericDelegate&amp;lt;int&amp;gt; intDelegate 
                = new MyGenericDelegate&amp;lt;int&amp;gt;(IntTarget);

            stringDelegate(&quot;Safak&quot;);
            intDelegate(26);

            Console.ReadLine();
        }

        static void StringTarget(string arg)
        {
            Console.WriteLine(&quot;arg in uppercase is: {0}&quot;, arg.ToUpper());
        }
        static void IntTarget(int arg)
        {
            Console.WriteLine(&quot;++arg is: {0}&quot;, ++arg);
        }&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi &lt;b&gt;delegate void MyGenericDelegate&amp;lt;T&amp;gt;(T args);&lt;/b&gt;&amp;nbsp;generic delege tanımı yaparak Hem StringTarget hemde IntTarget metodlarını saklayabildik. Bundan sonra double paramere alan geriye void döndüren bir fonksiyon yazsakta yeni bir delege tanımı yapmamıza gerek kalmayacak,&amp;nbsp;&lt;b&gt;MyGenericDelegate &lt;/b&gt;üzerinden nesne örneği oluşturup T yerine double vererek bunu gerçekleştirebiliriz.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdJG8olJnPg7sDXyhVo1nfGp5OPACeIvcLpeJrA8RlkD_nFEpYOHJXqTJGcc3wJIFIKJ7vZgRh2_aMZIJcYnRFGS8s5D6s8ohgRDbFNaeWVBDJZSxWjAJdolbqksZJ2IOZvJrAhHvgIVc/s1600/generic_delegate_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdJG8olJnPg7sDXyhVo1nfGp5OPACeIvcLpeJrA8RlkD_nFEpYOHJXqTJGcc3wJIFIKJ7vZgRh2_aMZIJcYnRFGS8s5D6s8ohgRDbFNaeWVBDJZSxWjAJdolbqksZJ2IOZvJrAhHvgIVc/s1600/generic_delegate_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Action&amp;lt;&amp;gt; ve Func&amp;lt;&amp;gt; Kullanımı:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Normal şartlarda delege kullanmamız için şu adımları gerçekleştirmemiz gerekiyor:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
* İçinde saklayacağı metot formatına uygun custom delege tanımı yapmak&lt;br /&gt;
* Bu custom delegeden bir nesne örneği oluşturmak&lt;br /&gt;
* Oluşturduğumuz nesne üzerinden Invoke işlemini gerçekleştirmek&lt;/blockquote&gt;
&lt;b&gt;Action&amp;lt;&amp;gt;&lt;/b&gt; ve&lt;b&gt; Func&amp;lt;&amp;gt; &lt;/b&gt;kısa bir şekilde delege tanımı yapmamıza olanak sağlıyor.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Action&amp;lt;&amp;gt; Kullanımı:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Geriye void döndüren metodları tutan delegeleri kısa yoldan tanımlamamızı sağlar.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        static void Main(string[] args)
        {
            Action&amp;lt;string, int&amp;gt; action
                      = new Action&amp;lt;string, int&amp;gt;(DisplayAge);
            action(&quot;Safak&quot;, 26);
        }

        static void DisplayAge(string fullName, int age)
        {
            Console.WriteLine(fullName + &quot; : &quot; + age);
        }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi delege tanımı yapmadan DisplayAge metodu saklandı ve Invoke edilebildi. Bir kez daha söylemekte fayda var&amp;nbsp;&lt;b&gt;Action&amp;lt;&amp;gt; geri değer döndürmez&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Func&amp;lt;&amp;gt; Kullanımı:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Action&amp;lt;&amp;gt; &#39;ın &lt;b&gt;geri değer döndürebilen halidir&lt;/b&gt;. Son parametre dönüş değer tipini belirtir. Örnek kullanım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        static void Main(string[] args)
        {
            Func&amp;lt;DateTime, double&amp;gt; func 
                 = new Func&amp;lt;DateTime, double&amp;gt;(GetUserAgeAtTime);
            double dateDif = func(DateTime.Now.AddYears(-2));
            Console.WriteLine(&quot;\nDate Dif: {0}&quot;, dateDif);

            Console.ReadLine();
        }

        static double GetUserAgeAtTime(DateTime birthDate)
        {
            return (DateTime.Now - birthDate).TotalDays;
        }
&lt;/pre&gt;
&lt;br /&gt;
Yukarıdaki örnekte &amp;lt;DateTime, double&amp;gt; şeklinde yazılmıştır. DateTime parametrenin tipini double ise dönüş değer tipini belirtir.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Örnek Projeler&lt;/b&gt; :&amp;nbsp;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/GenericDelegateExample.rar&quot;&gt;GenericDelegateExample.rar&lt;/a&gt; , &amp;nbsp;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/ActionFuncExample.rar&quot;&gt;ActionFuncExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/4151987462720389241/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-delegate-kullanimi-generic-delegeler.html#comment-form' title='3 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/4151987462720389241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/4151987462720389241'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-delegate-kullanimi-generic-delegeler.html' title='C# Delegate Kullanımı II - Generic Delegeler'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdJG8olJnPg7sDXyhVo1nfGp5OPACeIvcLpeJrA8RlkD_nFEpYOHJXqTJGcc3wJIFIKJ7vZgRh2_aMZIJcYnRFGS8s5D6s8ohgRDbFNaeWVBDJZSxWjAJdolbqksZJ2IOZvJrAhHvgIVc/s72-c/generic_delegate_ss.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-8781249615595060332</id><published>2013-12-12T00:26:00.001+02:00</published><updated>2013-12-12T21:44:36.063+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Delegate"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Delegate Kullanımı I - Delege Nedir?</title><content type='html'>C# dilinde &lt;b&gt;delegelerin &lt;/b&gt;kullanım amacı metot saklamaktır. Delegeler&lt;b&gt; Olay(event) tabanlı programlama&lt;/b&gt; ve &lt;b&gt;asenkron programlama&lt;/b&gt; yaparken, &lt;b&gt;anonim metot&lt;/b&gt; yazarken kullanılır. Bir diğer kullanım amacı da, bir &lt;b&gt;metoda parametre olarak başka bir metot verebilmektir&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Delegate tanımlanırken şu öğeler belirtilmelidir:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
* Saklanacak metot&lt;br /&gt;
* Eğer dönüş değeri varsa dönüş değeri&lt;br /&gt;
* Eğer saklanacak metodun parametreleri varsa bu parametreler&lt;/blockquote&gt;
&lt;br /&gt;
Örnek bir delege tanımı:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    delegate int MyDelegate(int x);
    MyDelegate temsilci = new MyDelegate(CalisacakMetot);
&lt;/pre&gt;
&lt;br /&gt;
Yukarıda örnek bir delege tanımı yaptık. İlk satırda yazdığımız &quot;&lt;b&gt;delegate int&lt;/b&gt;&quot; delege içerisinde saklayacağımız metodun int tipinde dönüş değeri olacağını gösteriyor. &quot;&lt;b&gt;(int x)&lt;/b&gt;&quot; ise saklayacağımız metodumuzun int tipinde değer alacağını gösteriyor. Alt satıra geçersek ise &quot;&lt;b&gt;CalisacakMetot&lt;/b&gt;&quot; delegemizin saklayacağı metot ismidir. Kısacası bu delege tanımı; programımızın içinde şu şekilde tanımladığımız &quot;&lt;b&gt;int CalisacakMetot(int x)&lt;/b&gt;&quot; metodunu gerektiğinde çağırmak için saklıyor.&lt;br /&gt;
&lt;br /&gt;
Şimdi örnek bir delege uygulaması yapalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    delegate int MathOperation(int x, int y);

    public class SimpleMath
    {
        public static int Add(int x, int y)
        { 
            int retVal = x +y;
            Console.WriteLine(&quot;Add : &quot; + retVal);
            return retVal;
        }
        public static int Subtract(int x, int y)
        {
            int retVal = x - y;
            Console.WriteLine(&quot;Subtract : &quot; + retVal);
            return retVal;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MathOperation mathOp = new MathOperation(SimpleMath.Add);
            mathOp(5,3);

            Console.ReadKey();
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Burada &quot;&lt;b&gt;delegate int MathOperation(int x, int y);&lt;/b&gt;&quot; satırıyla basit bir delege tanımı yaptık. Tanımı yaparken saklayacağı metodların &lt;b&gt;dönüş tiplerinin int&lt;/b&gt; olması gerektiğini ve bu metodların &lt;b&gt;int tipinde 2 parametre&lt;/b&gt; alması gerektiğini belirttik.&lt;br /&gt;
&lt;br /&gt;
Daha sonra ise &quot;&lt;b&gt;MathOperation mathOp = new MathOperation(SimpleMath.Add)&lt;/b&gt;&quot; bu satır ile mathOp delege nesnesi oluşturduk. Nesne örneği oluşturulurken construtor üzerinden bu delege nesnesine &lt;b&gt;SimpleMath.Add&lt;/b&gt; metodunu saklaması için ekledik. Artık delegemiz bu metodu saklar hale geldi.&lt;br /&gt;
&lt;br /&gt;
En canalıcı kısma geçersekte &quot;&lt;b&gt;mathOp(5,3)&lt;/b&gt;&quot; bu şekilde delege nesnemiz üzerinden sakladığı metot olan&amp;nbsp;&lt;b&gt;SimpleMath.&lt;/b&gt;&lt;b&gt;Add &lt;/b&gt;metoduna 5 ve 3 değerlerini verip bu metodu çalıştırdık.&lt;br /&gt;
&lt;br /&gt;
Program çalıştığında çıktı 5+3&#39;ten &quot;&lt;b&gt;Add : 8&lt;/b&gt;&quot; şeklinde olacaktır.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfs5BdEwoq1fJtKbk7n7UfLOSRJb16j4evZ6H32-qlPlNAYfUkzCzSxYvuuONnvbbAXv0EU8eMNSTJDwl3KLz_TaeciOArrgcw5h7V5yCLIXkG40fU1Fls5_h_CFlfUuAFSUJrudzWcxk/s1600/delegate_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfs5BdEwoq1fJtKbk7n7UfLOSRJb16j4evZ6H32-qlPlNAYfUkzCzSxYvuuONnvbbAXv0EU8eMNSTJDwl3KLz_TaeciOArrgcw5h7V5yCLIXkG40fU1Fls5_h_CFlfUuAFSUJrudzWcxk/s1600/delegate_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span id=&quot;goog_983439870&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_983439871&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Bir delege birden fazla metot saklayabilir. &quot;&lt;b&gt;+=&lt;/b&gt;&quot; ile delegeye metot ekleyebiliriz. Eklediğimiz metodlar &lt;b&gt;FIFO &lt;/b&gt;mantığıyla ilk eklenen metoddan başlayıp sen eklenen metoda doğru sırayla çalıştırılır.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    mathOp += SimpleMath.Subtract;
&lt;/pre&gt;
&lt;br /&gt;
programımıza bu satırı eklediğimizde artık önce &lt;b&gt;Add &lt;/b&gt;metodu ardından &lt;b&gt;Subtract &lt;/b&gt;metodu çalışacaktır. Şimdi çıktımız şu şekilde olacaktır.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCMiHMxOk1rlCR4x2QsqXUEtlcrX3giKC6JrEiCTarJ1phjFnIVhMHWsgkQUJr6K-GDLtNIwQH_DEJZcPZV6PyGNhWLgq1jmBiSqfA-5q4tHc2qsOo6I0KaRegEOMQS7LEyz1EAOIaznQ/s1600/delegate_ss2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCMiHMxOk1rlCR4x2QsqXUEtlcrX3giKC6JrEiCTarJ1phjFnIVhMHWsgkQUJr6K-GDLtNIwQH_DEJZcPZV6PyGNhWLgq1jmBiSqfA-5q4tHc2qsOo6I0KaRegEOMQS7LEyz1EAOIaznQ/s1600/delegate_ss2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Metod ekleyebildiğimiz gibi &quot;-=&quot; ile saklanan metodları silebilirizde:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    mathOp -= SimpleMath.Add;
&lt;/pre&gt;
&lt;br /&gt;
Bu kod satırının ardından artık &lt;b&gt;Add &lt;/b&gt;metodu çalışmıyacaktır. Çıktı artık şu şekilde olcaktır:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkn0v1OrFyvJ0oklEzN-M-hW3ohmbUftTU20uumrVPcA2yorB4A3QxrDU34ch-Drx9_6OJc0i6FdTS1bq7LgXr10FmRjKO35bNj2CHOU9RJzz4Znhsh846iUQF1VXOSSjvgKKEvi9XDZk/s1600/delegate_ss3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkn0v1OrFyvJ0oklEzN-M-hW3ohmbUftTU20uumrVPcA2yorB4A3QxrDU34ch-Drx9_6OJc0i6FdTS1bq7LgXr10FmRjKO35bNj2CHOU9RJzz4Znhsh846iUQF1VXOSSjvgKKEvi9XDZk/s1600/delegate_ss3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Bir &lt;b&gt;delege &lt;/b&gt;tanımı yapılınca arka planda&amp;nbsp;&lt;b&gt;System.MulticastDelegate&lt;/b&gt;&#39;den türetilmiş &lt;b&gt;sealed &lt;/b&gt;bir class oluşturulur.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;ildasm&amp;nbsp;&lt;/b&gt;toolu&amp;nbsp;ile exe&#39;mizin içerisine bakarsanız bizim MathOperation delegemizin için de sealed bir class oluşturulmuş olduğunu görürsünüz.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeSqtrM6Y2P28FYTR5YXW-XY2GHREE-Dv6Rvmo4OjN3C78rvonG8i-lr5nVX2YniRvERz3UonBv3pKcAwBhfLX38-GexyYohSB03Pbtx1MiHkABX_VtF_SUfuGrutg8s0wkT5sOmpqUIs/s1600/delegate_ss1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeSqtrM6Y2P28FYTR5YXW-XY2GHREE-Dv6Rvmo4OjN3C78rvonG8i-lr5nVX2YniRvERz3UonBv3pKcAwBhfLX38-GexyYohSB03Pbtx1MiHkABX_VtF_SUfuGrutg8s0wkT5sOmpqUIs/s1600/delegate_ss1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Burada dikkatinizi &lt;b&gt;BeginInvode&lt;/b&gt;, &lt;b&gt;EndInvoke &lt;/b&gt;ve &lt;b&gt;Invoke &lt;/b&gt;metodlarına çekmek istiyorum.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Invoke&lt;/b&gt;: Saklanan metodları senkron şekilde çalıştırır. Örneğimize dönersek &quot;&lt;b&gt;mathOp(5,3)&lt;/b&gt;&quot; dediğimizde aslında &quot;&lt;b&gt;mathOp.Invoke(5,3)&lt;/b&gt;&quot; metodu çalışıyor ve saklanan metodlarımız Invoke metodu yardımıyla sırayla çalıştırılıyor.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;BeginInvoke &lt;/b&gt;ve &lt;b&gt;EndInvoke &lt;/b&gt;ise asenkron işlemlerde kullanılıyor fakat bu konuya ileriki yazılarımızda incelemeye çalışacağız.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;GetInvocationList&lt;/b&gt;: Delegemizin sakladığı metot listesini döndürür. Örnek kullanımı şu şekildedir:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;            // delegenin sakladigi metodlar listeleniyor
            foreach (Delegate d in mathOp.GetInvocationList())
            {
                Console.WriteLine(&quot;Method Name: {0}&quot;, d.Method);
                //SimpleMath static oldugu icin bos gelecektir
                Console.WriteLine(&quot;Type Name: {0}&quot;, d.Target);
            }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Örnek Proje:&amp;nbsp;&lt;/b&gt;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/DelegateExample.rar&quot;&gt;DelegateExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/8781249615595060332/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-delegate-kullanimi-delege-nedir.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/8781249615595060332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/8781249615595060332'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-delegate-kullanimi-delege-nedir.html' title='C# Delegate Kullanımı I - Delege Nedir?'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfs5BdEwoq1fJtKbk7n7UfLOSRJb16j4evZ6H32-qlPlNAYfUkzCzSxYvuuONnvbbAXv0EU8eMNSTJDwl3KLz_TaeciOArrgcw5h7V5yCLIXkG40fU1Fls5_h_CFlfUuAFSUJrudzWcxk/s72-c/delegate_ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-9145891792358054977</id><published>2013-12-11T21:11:00.001+02:00</published><updated>2013-12-11T21:13:24.239+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Collections ObjectModel"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic Collections"/><category scheme="http://www.blogger.com/atom/ns#" term="ObservableCollection"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Generic ObservableCollection&amp;lt;T&amp;gt; Kullanımı</title><content type='html'>&lt;b&gt;ObservableCollection&amp;lt;T&amp;gt;&lt;/b&gt; yapımız&amp;nbsp;&lt;b&gt;System.Collections.ObjectModel&lt;/b&gt; namespace&#39;i altında bulunuyor. İçerisinde aynen &lt;b&gt;List&amp;lt;T&amp;gt;&lt;/b&gt; gibi T ile belirttiğimiz tipte elemanlar tutar.&lt;b&gt; List&amp;lt;T&amp;gt;&lt;/b&gt; collection yapısından en önemli farkı ise içerisinde &lt;b&gt;CollectionChanged &lt;/b&gt;isminde bir &lt;b&gt;event &lt;/b&gt;barındırmasıdır. Collection nesnemiz değiştiğinde bu event fire olur ve biz bu sayede collection nesnemiz üzerindeki değişikliklerden haberdar oluruz.&lt;br /&gt;
&lt;br /&gt;
Şimdi örnek bir program ile collection yapımızı inceleyelim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt; public class Person
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public int Age { get; set; }

        public override string ToString()
        {
            return &quot;Fullname: &quot; + Name + &quot; &quot; + Surname + &quot; Age: &quot; + Age;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ObservableCollection&amp;lt;Person&amp;gt; people 
                = new ObservableCollection&amp;lt;Person&amp;gt;();

            // event&#39;i delege ediyoruz
            people.CollectionChanged += people_CollectionChanged;

            people.Add(new Person() 
                { Name = &quot;Salih&quot;, Surname = &quot;Sayar&quot;, Age = 42 });
            people.Add(new Person() 
                { Name = &quot;Ahmet&quot;, Surname = &quot;Yilmaz&quot;, Age = 21 });

            people.RemoveAt(0);

            Console.ReadLine();
        }

        private static void people_CollectionChanged(object sender,
  System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            // Ne nedenle bu event calisti?
            Console.WriteLine(&quot;nAction for this event: {0}&quot;, e.Action);

            // Silindi ise
            if (e.Action == 
   System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
            {
                Console.WriteLine(&quot;Silinen insanlar:&quot;);
                foreach (Person p in e.OldItems)
                {
                    Console.WriteLine(p.ToString());
                }
                Console.WriteLine();
            }

            // eklendi ise
            if (e.Action == 
    System.Collections.Specialized.NotifyCollectionChangedAction.Add)
            {
                Console.WriteLine(&quot;Eklenen insanlar:&quot;);
                foreach (Person p in e.NewItems)
                {
                    Console.WriteLine(p.ToString());
                }
            }
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM3n9E_YujwA_bDSnFJyAwyn45etyGU9A4ewXTVOJlR64L-MPLj3p2IFNEQauj9T_GSLpmoFkVYIcBEI8M5CfHdgwyl_BBC14DJCa_qx_PU35MtcVveJwZ1hz1xh98AkBhCd782BXoy10/s1600/observable_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM3n9E_YujwA_bDSnFJyAwyn45etyGU9A4ewXTVOJlR64L-MPLj3p2IFNEQauj9T_GSLpmoFkVYIcBEI8M5CfHdgwyl_BBC14DJCa_qx_PU35MtcVveJwZ1hz1xh98AkBhCd782BXoy10/s1600/observable_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Örnek Proje:&amp;nbsp;&lt;/b&gt;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/ObservableCollectionExample.rar&quot;&gt;ObservableCollectionExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/9145891792358054977/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-generic-observablecollection-kullanimi.html#comment-form' title='1 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/9145891792358054977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/9145891792358054977'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-generic-observablecollection-kullanimi.html' title='C# Generic ObservableCollection&amp;lt;T&amp;gt; Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM3n9E_YujwA_bDSnFJyAwyn45etyGU9A4ewXTVOJlR64L-MPLj3p2IFNEQauj9T_GSLpmoFkVYIcBEI8M5CfHdgwyl_BBC14DJCa_qx_PU35MtcVveJwZ1hz1xh98AkBhCd782BXoy10/s72-c/observable_ss.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-1546736093739041662</id><published>2013-12-11T20:37:00.000+02:00</published><updated>2013-12-11T20:37:12.928+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic Collections"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><category scheme="http://www.blogger.com/atom/ns#" term="SortedSet"/><title type='text'>C# Generic SortedSet&amp;lt;T&amp;gt; Kullanımı</title><content type='html'>&lt;b&gt;SortedSet&amp;lt;T&amp;gt;&lt;/b&gt; yapısı &lt;b&gt;C#&lt;/b&gt;&#39;ın generic collection yapılarından biridir. T ile belirttiğimiz tipte elemanlar tutar. C# 4.0 ile hayatımıza girmiş yapılardan biridir. Bu yapının en önemli özelliği &lt;b&gt;listeyi sıralı tutması&lt;/b&gt;dır. Siz yeni bir eleman eklesenizde silsenizde liste yine sıralı olacaktır.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;SortedSet &lt;/b&gt;ile int, string gibi tipler tutacaksak bu tipler &lt;b&gt;IComparer &lt;/b&gt;interface&#39;ini implemente ettiği için ekstra hiç bir şey yapmamıza gerek yoktur. Bu elemenları &lt;b&gt;SortedSet&#39;e &lt;/b&gt;ekleriz o arkada bunları sıralar. Peki Person isminde bir sınıf tutacaksak bunu nasıl sıralıyacak?&lt;br /&gt;
&lt;br /&gt;
Bunun için kendi &lt;b&gt;Comparer &lt;/b&gt;sınıfımızı yazmamış gerekir. Şimdi gelin bu durumu kod üzerinde inceleyelim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt; public class Person
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public int Age { get; set; }

        public override string ToString()
        {
            return &quot;Fullname: &quot; + Name + &quot; &quot; + Surname + &quot; Age: &quot; + Age;
        }
    }

    public class PersonComparer : IComparer&amp;lt;Person&amp;gt;
    {
        public int Compare(Person x, Person y)
        {
            // 1: siralamada daha onde
            //-1: siralamada daha geride
            // 0: ayni sirada
            if (x.Age &amp;gt; y.Age)
                return 1;
            else if (x.Age &amp;lt; y.Age)
                return -1;
            else
                return 0;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //PersonComparer sinifi ile liste yasa gore sirali
            //hale getiriliyor.
            SortedSet&amp;lt;Person&amp;gt; personSortedSet 
                = new SortedSet&amp;lt;Person&amp;gt;(new PersonComparer());

            //SortedSet yapisina Person nesnelerini ekliyoruz
            personSortedSet.Add(new Person() 
                { Name = &quot;Salih&quot;, Surname = &quot;Sayar&quot;, Age = 42 });
            personSortedSet.Add(new Person() 
                { Name = &quot;Ahmet&quot;, Surname = &quot;Yilmaz&quot;, Age = 21 });
            personSortedSet.Add(new Person() 
                { Name = &quot;Safak&quot;, Surname = &quot;Unel&quot;, Age = 26 });

            // 3 person yasina gore sirali ekrana yaziliyor
            foreach (Person p in personSortedSet)
            {
                Console.WriteLine(p);
            }
            Console.WriteLine();

            // 2 kisi daha ekleniyor
            personSortedSet.Add(new Person() 
                { Name = &quot;Sunay&quot;, Surname = &quot;Tarik&quot;, Age = 23 });
            personSortedSet.Add(new Person() 
                { Name = &quot;Eren&quot;, Surname = &quot;Sahan&quot;, Age = 34 });

            // yeni eklenen 2 person nesnesi sirali sekilde
            // eklenecektir.
            foreach (Person p in personSortedSet)
            {
                Console.WriteLine(p);
            }

            Console.ReadLine();
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhTy0jPToOpioUZtWcTvZAK9QdrHxS9adFN-i1WmnH5DWxuovbQ5qtoYyKnKnLjiZsoHkcc0ZcfiExuPyfQbA2g_dVkw3wo-ZGaUJnUSa4uOYqjsGbMWRcLv06On0x7YQ4jXiIgjm89kI/s1600/sortedset_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhTy0jPToOpioUZtWcTvZAK9QdrHxS9adFN-i1WmnH5DWxuovbQ5qtoYyKnKnLjiZsoHkcc0ZcfiExuPyfQbA2g_dVkw3wo-ZGaUJnUSa4uOYqjsGbMWRcLv06On0x7YQ4jXiIgjm89kI/s1600/sortedset_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Örnek Proje:&amp;nbsp;&lt;/b&gt;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/GenericSortedSetExample.rar&quot;&gt;GenericSortedSetExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/1546736093739041662/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-generic-sortedset-kullanm.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/1546736093739041662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/1546736093739041662'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-generic-sortedset-kullanm.html' title='C# Generic SortedSet&amp;lt;T&amp;gt; Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhTy0jPToOpioUZtWcTvZAK9QdrHxS9adFN-i1WmnH5DWxuovbQ5qtoYyKnKnLjiZsoHkcc0ZcfiExuPyfQbA2g_dVkw3wo-ZGaUJnUSa4uOYqjsGbMWRcLv06On0x7YQ4jXiIgjm89kI/s72-c/sortedset_ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-1615577253898250241</id><published>2013-12-11T20:01:00.002+02:00</published><updated>2013-12-11T20:04:42.905+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic Collections"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><category scheme="http://www.blogger.com/atom/ns#" term="Queue"/><title type='text'>C# Generic Queue&amp;lt;T&amp;gt; Kullanımı</title><content type='html'>&lt;b&gt;Queue&amp;lt;T&amp;gt;&lt;/b&gt; yapısı &lt;b&gt;C#&lt;/b&gt;&#39;ın generic collection yapılarından biridir.&amp;nbsp;T ile belirttiğimiz tipte elemanlar tutar ve &lt;b&gt;FIFO &lt;/b&gt;(ilk giren ilk çıkar) mantığıyla elemanları dışarı çıkartır.&lt;br /&gt;
&lt;br /&gt;
Bu yapıya örnek olarak bankaya gittiğimizde girdiğimiz sırayı verebiliriz. İlk bankaya gidene ilk sıra gelir gibi.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Enqueue &lt;/b&gt;: Queue yapımıza yeni bir eleman eklemek için kullanılır.&lt;br /&gt;
&lt;b&gt;Dequeue &lt;/b&gt;: Queue yapımızdan sıradaki ilk elemanı alıp bu elemanı siler.&lt;br /&gt;
&lt;b&gt;Peek &lt;/b&gt;:&amp;nbsp;Queue&#39;deki&amp;nbsp;nesneyi silmeden son elemanı döndürür.&lt;br /&gt;
&lt;br /&gt;
Şimdi örnek bir &lt;b&gt;Queue &lt;/b&gt;yapısı geliştirelim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt; public class Person
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public int Age { get; set; }

        public override string ToString()
        {
            return &quot;Fullname: &quot; + Name + &quot; &quot; + Surname + &quot; Age: &quot; + Age;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Queue&amp;lt;Person&amp;gt; personQueue = new Queue&amp;lt;Person&amp;gt;();

            //Queue yapisina Person nesnelerini ekliyoruz
            personQueue.Enqueue(new Person() 
                 { Name = &quot;Ahmet&quot;, Surname = &quot;Yilmaz&quot;, Age = 21 });
            personQueue.Enqueue(new Person() 
                 { Name = &quot;Safak&quot;, Surname = &quot;Unel&quot;, Age = 26 });
            personQueue.Enqueue(new Person() 
                 { Name = &quot;Salih&quot;, Surname = &quot;Sayar&quot;, Age = 42 });

            //Peeked: son eleman silmeden queue&#39;deki son elemana bakiliyor
            //Dequeue: ilk eleman cekilip siliniyor  
            Console.WriteLine(&quot;Peeked : {0}&quot;, personQueue.Peek());
            Console.WriteLine(&quot;Dequeue : {0}&quot;, personQueue.Dequeue());

            Console.WriteLine(&quot;nPeeked : {0}&quot;, personQueue.Peek());
            Console.WriteLine(&quot;Dequeue : {0}&quot;, personQueue.Dequeue());

            Console.WriteLine(&quot;nPeeked : {0}&quot;, personQueue.Peek());
            Console.WriteLine(&quot;Dequeue : {0}&quot;, personQueue.Dequeue());

            try
            {
                // eger stack&#39;imiz bosalttiktan sora Peek veya Pop  
                // metodlarimizi cagirirsak hata aliriz  
                Console.WriteLine(&quot;nPeeked : {0}&quot;, personQueue.Peek());
                Console.WriteLine(&quot;Dequeue: {0}&quot;, personQueue.Dequeue());
            }
            catch (Exception e)
            {
                Console.WriteLine(&quot;nError: {0}&quot;, e.Message);
            }

            Console.ReadLine();  

        }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGCucc_6Qtemp5ZVX6uQsPg_CatJQHz0lpanXnbE50cZLMeNyawwWWObr4_t4dOVPMTlyYWnuft9t7JQV4iJMVw_fG05oYYmeJ2IYHGVzNba4LZ8C8_MaDRK-m9QIQHJYpeyCJ2RUEAqk/s1600/queue_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGCucc_6Qtemp5ZVX6uQsPg_CatJQHz0lpanXnbE50cZLMeNyawwWWObr4_t4dOVPMTlyYWnuft9t7JQV4iJMVw_fG05oYYmeJ2IYHGVzNba4LZ8C8_MaDRK-m9QIQHJYpeyCJ2RUEAqk/s1600/queue_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Örnek Proje:&amp;nbsp;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/GenericQueueExample.rar&quot;&gt;GenericQueueExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/1615577253898250241/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-queue-stack-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/1615577253898250241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/1615577253898250241'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-queue-stack-kullanimi.html' title='C# Generic Queue&amp;lt;T&amp;gt; Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGCucc_6Qtemp5ZVX6uQsPg_CatJQHz0lpanXnbE50cZLMeNyawwWWObr4_t4dOVPMTlyYWnuft9t7JQV4iJMVw_fG05oYYmeJ2IYHGVzNba4LZ8C8_MaDRK-m9QIQHJYpeyCJ2RUEAqk/s72-c/queue_ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-7923837003087101249</id><published>2013-12-11T00:09:00.000+02:00</published><updated>2013-12-11T20:03:46.810+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic Collections"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><category scheme="http://www.blogger.com/atom/ns#" term="Stack"/><title type='text'>C# Generic Stack&amp;lt;T&amp;gt; Kullanımı</title><content type='html'>&lt;b&gt;Stack&amp;lt;T&amp;gt;&lt;/b&gt; yapısı &lt;b&gt;C#&lt;/b&gt;&#39;ın generic collection yapılarından biridir. T ile belirttiğimiz tipte elemanlar tutar ve &lt;b&gt;LIFO &lt;/b&gt;(Son giren ilk çıkar) mantığıyla elemanları dışarı çıkartır.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Push&lt;/b&gt;&amp;nbsp;: Collection nesnemize yeni eleman ekler.&lt;br /&gt;
&lt;b&gt;Pop&lt;/b&gt;&amp;nbsp;: Collection&#39;a son giren elemanı çekip bu elemanı collection&#39;dan siler.&lt;br /&gt;
&lt;b&gt;Peek&lt;/b&gt;&amp;nbsp;: Collection&#39;daki nesneyi silmeden son elemanı döndürür.&lt;br /&gt;
&lt;br /&gt;
Şimdi örnek bir stack yapısı geliştirelim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;       public class Person
       {
           public string Name { get; set; }
           public string Surname { get; set; }
           public int Age { get; set; }

           public override string ToString()
           {
              return Name + &quot; &quot; + Surname + &quot; Age: &quot; + Age;
           }
        }
        static void Main(string[] args)
        {
            Stack&amp;lt;Person&amp;gt; personStack = new Stack&amp;lt;Person&amp;gt;();

            personStack.Push(new Person() 
                 { Name = &quot;Ahmet&quot;, Surname = &quot;Yilmaz&quot;, Age = 21 });
            personStack.Push(new Person() 
                 { Name = &quot;Safak&quot;, Surname = &quot;Unel&quot;, Age = 26 });
            personStack.Push(new Person() 
                 { Name = &quot;Salih&quot;, Surname = &quot;Sayar&quot;, Age = 42 });

            //Peeked: son eleman silmeden stack&#39;teki son elemana bakiliyor
            //Popped: son eleman cekilip siliniyor
            Console.WriteLine(&quot;Peeked : {0}&quot;, personStack.Peek());
            Console.WriteLine(&quot;Popped : {0}&quot;, personStack.Pop());

            Console.WriteLine(&quot;\nPeeked : {0}&quot;, personStack.Peek());
            Console.WriteLine(&quot;Popped: {0}&quot;, personStack.Pop());

            Console.WriteLine(&quot;\nPeeked : {0}&quot;, personStack.Peek());
            Console.WriteLine(&quot;Popped: {0}&quot;, personStack.Pop());

            try
            {
                // eger stack&#39;imiz bosalttiktan sora Peek veya Pop
                // metodlarimizi cagirirsak hata aliriz
                Console.WriteLine(&quot;\nPeeked : {0}&quot;, personStack.Peek());
                Console.WriteLine(&quot;Popped: {0}&quot;, personStack.Pop());
            }
            catch (Exception e)
            {
                Console.WriteLine(&quot;\nError: {0}&quot;, e.Message);
            }

            Console.ReadLine();
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLFwJIpp2mHjxef9yAUPdpBczOYLj-zmItyF735MKNiXxbUGBl1HjQwOuBary6xwH0JAntQic2USITPdoi0d4csS0r3QMSBXSZwEormYOvndIjUNRUyWW9oDwIZp0qCAHAQbP1zINhsyw/s1600/stack_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLFwJIpp2mHjxef9yAUPdpBczOYLj-zmItyF735MKNiXxbUGBl1HjQwOuBary6xwH0JAntQic2USITPdoi0d4csS0r3QMSBXSZwEormYOvndIjUNRUyWW9oDwIZp0qCAHAQbP1zINhsyw/s1600/stack_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Örnek Proje :&lt;/b&gt;&amp;nbsp;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/GenericStackExample.rar&quot;&gt;GenericStackExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/7923837003087101249/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-generic-stack-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/7923837003087101249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/7923837003087101249'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-generic-stack-kullanimi.html' title='C# Generic Stack&amp;lt;T&amp;gt; Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLFwJIpp2mHjxef9yAUPdpBczOYLj-zmItyF735MKNiXxbUGBl1HjQwOuBary6xwH0JAntQic2USITPdoi0d4csS0r3QMSBXSZwEormYOvndIjUNRUyWW9oDwIZp0qCAHAQbP1zINhsyw/s72-c/stack_ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-2741767841280541580</id><published>2013-12-09T23:48:00.000+02:00</published><updated>2013-12-10T00:14:40.071+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic Class"/><category scheme="http://www.blogger.com/atom/ns#" term="Generic Collections"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Generic Liste-Sınıf Yapıları</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhA7dnavLEjFESn60NOUnZpmgM4Xt_oxGbQ1oqFzJd_9xGXlWitNpWr10DgXbxy4UNNFgzTEg4Txa1VgfIW7peSBIUDXJXBxDV-QwLnj68m36pNUUF8v3VrX1pgGDj3mzpfRGRpvAmzUc/s1600/cupt.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhA7dnavLEjFESn60NOUnZpmgM4Xt_oxGbQ1oqFzJd_9xGXlWitNpWr10DgXbxy4UNNFgzTEg4Txa1VgfIW7peSBIUDXJXBxDV-QwLnj68m36pNUUF8v3VrX1pgGDj3mzpfRGRpvAmzUc/s200/cupt.jpg&quot; width=&quot;186&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Soldaki kupa fotografını&amp;nbsp;&lt;b&gt;generic &lt;/b&gt;konusunu araştırırken buldum çok hoşuma gittiği için sizle paylaşmak istedim. Aslında fotograf tüm konuyu özetliyor T kupamızın içerisine koyacağımız çay, kahve, su gibi değişkenleri simgeliyor. Bizde T&#39;ye bunlardan birini verip kupamızı dolduruyoruz. Yazının soununda fotografa dönün sizde çok seveceksiniz:)&lt;br /&gt;
&lt;br /&gt;
Asıl konumuza dönersek neden &lt;b&gt;generic &lt;/b&gt;sınıf ve listelere ihtiyaç duyuyoruz bunu anlamak için önce non-generic üyeler kullanarak bir kaç örnek yapalım bakalım ne takım problemler ortaya çıkacak görelim.&lt;br /&gt;
&lt;br /&gt;
Önce hepimizin defalarca kullandığı dizileri düşünelim: Dizi tanımı yapılırken dizi hangi tipte değerler taşıyacak ise bunu belirtmemiz gerekiyor; dizimiz string tipinde değerler tutacak ise string, int tipinde değerler tutacaksa int tipinde dizi oluşturulur. Daha sonrada dizimize boyut vermemiz gerekir. Bunları örnek bir string dizisi tanımlayarak gösterelim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;static void Main(string[] args)
{
   // string tipinde 3 elemanli bir dizi olusturalim
   string[] strArray = {&quot;Ahmet&quot;, &quot;Mehmet&quot;, &quot;Ali&quot; };
}
&lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp;Gördüğünüz gibi dizimizin boyutunu 3 verdik bu yüzden bu dizi artık 3 değer tutar 4. değeri artık bu diziye atayamayız. Atarsak hata alırız. Peki bizim ne kadarlık bir diziye ihtiyaç duyduğumuz önceden belli değilse ne olacak? Ya çok büyük bir dizi tanımlayacağız ama bu da belekte boşa yer kaplayacaktır ya da tahmin ettiğimizden daha fazla kayıt gelince programımız patlayacaktır.&lt;br /&gt;
&lt;br /&gt;
Bu durumu ortadan kaldırmak için &lt;b&gt;System.Collection&lt;/b&gt; namespace&#39;i altında bulunan &lt;b&gt;ArrayList &lt;/b&gt;gibi collection sınıflarını kullanabiliriz. Bu collection&#39;lara önceden boyut belirtmek zorunda değiliz. Add metodu ile istediğimiz sayıda obje saklayabiliriz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;static void Main(string[] args)
{
    ArrayList strArray = new ArrayList();
    strArray.Add(&quot;Ahmet&quot;);
    strArray.Add(&quot;Mehmet&quot;);
    strArray.Add(&quot;Ali&quot;);
    strArray.Add(&quot;Ayşe&quot;);
}
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi bir boyut vermeden istediğimiz sayıda obje gönderebildik. Peki aynı ArrayList&#39;e tüm gönderdiğimiz değerler &lt;b&gt;string &lt;/b&gt;tipinde olmasına rağmen 5. obje olarak &lt;b&gt;int&lt;/b&gt; tipinde bir obje gönderebilir miyiz?&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;  strArray.Add(1);
&lt;/pre&gt;
İşte aslında neden generic listelere ihtiyaç duyuyoruz bu sorunun cevabında gizli. Evet gönderebiliriz. Çünkü ArrayList &lt;b&gt;object &lt;/b&gt;tipinde nesneler tutar. string, int, class tüm bunlar .net dünyasında bir object olduğu için ArrayList&#39;te hepsi aynı anda tutulabilir. Peki bunun dezavantajları nelerdir? Listeleyelim:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;*&lt;/b&gt; ArrayList&#39;e bir eleman eklediğimizde bu eleman object tipinde değilse ArrayList object tipinde elemanlar tuttuğu için arkaplanda önce bu eleman objeye çevrilir öyle ArayList&#39;e eklenir. Bu performans sorununa neden olacaktır.&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;*&lt;/b&gt; Tersi içinde aynı durum söz konusudur. ArrayList&#39;ten bir eleman çektiğimizde object tipinde bize dönecektir. Fakat biz bu elamanı int tipinde istiyorsak bunu int&#39;e çevirmemiz gerekecektir. Aynı şekilde buda performans sorununa neden olacaktır.&amp;nbsp;&lt;/blockquote&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;*&lt;/b&gt; foreach ile ArrayList&#39;imiz üzerinde döndüğümüzü düşünelim bize gelen her nesne object olduğu için gerçek halinin ne olduğunu bilemeyiz. Gelen her elemanı int tipine çevirsek belki arada bir string tipinde &quot;Ayşe&quot; gelecektir bu durumda programımız hata alacaktır. Yani non-generic koleksiyonlar type-safe değildir.&lt;/blockquote&gt;
&lt;br /&gt;
Peki bu tip durumlardan kurtulmak için ne kullanmamız gerekiyor: &lt;b&gt;Generic List&amp;lt;T&amp;gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;// Bu List&amp;lt;T&amp;gt; artık sadece int tipinde elemanlar tutar
List&lt;int&gt; intListesi = new List&lt;int&gt;();
intListesi.Add(10);
intListesi.Add(2);
&lt;/int&gt;&lt;/int&gt;&lt;/pre&gt;
&lt;br /&gt;
Bu durumda artık listeye int tipinde bir eleman eklenirken arka planda obje tipine çevrilmesine gerek kalmadı. Aynı şekilde generic listemizden bir eleman çektiğimizde bunun int tipinde olacağından eminiz, fazladan bir convert işlemi yapmamızda gerek kalmadı. Ayrıca dönecek elemanın int tipinde olacağı kesin olduğu için type-safe bir yapıya sahiptir.&lt;br /&gt;
&lt;br /&gt;
Bunun gibi&amp;nbsp;&lt;b&gt;List&amp;lt;T&amp;gt;&lt;/b&gt;,&amp;nbsp;&lt;b&gt;Stack&amp;lt;T&amp;gt;&lt;/b&gt;,&amp;nbsp;&lt;b&gt;Queue&amp;lt;T&amp;gt;&lt;/b&gt;,&amp;nbsp;&lt;b&gt;SortedSet&amp;lt;T&amp;gt;&lt;/b&gt; gibi generic liste yapıları mevcuttur bu yapılarla ilgili örnekleri ilerleyen yazılarımızda paylaşacağız. Ayrıca ilginç bir collection yapısı olan&amp;nbsp;&lt;b&gt;ObservableCollection&amp;lt;T&amp;gt;&lt;/b&gt;&#39;da mevcuttur incelemenizi öneririm.&lt;br /&gt;
&lt;br /&gt;
Bunların dışında .Net Freamwork&#39;ü içerisinde bir çok generic &lt;b&gt;interface&lt;/b&gt;, &lt;b&gt;sınıf , metot&amp;nbsp;&lt;/b&gt;ve &lt;b&gt;liste &lt;/b&gt;bulunmaktadır. Bizde kendi &lt;b&gt;generic&amp;nbsp;interface&lt;/b&gt;,&amp;nbsp;&lt;b&gt;sınıf &lt;/b&gt;ve &lt;b&gt;metodlarımızı&lt;/b&gt;&amp;nbsp;yazabiliriz. Örnek bir metot yazarak bunu açıklayalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;
//int tipinde Swap
static void Swap(ref int a, ref int b)
{
   int temp;
   temp = a;
   a = b;
   b = temp;
}
&lt;/pre&gt;
&lt;br /&gt;
Görüldüğü gibi gönderilen 2 int değerini birbirine atayan basit bir Swap metodu yazdık. Fakat düşünün ki daha sonra string tipindeki 2 elemanı birbirine atayacak bir metoda daha ihtiyaç duyduk. Bu durumda bir metot daha yazmamız gerekecek:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;
//string tipinde Swap
static void Swap(ref string a, ref string b)
{
   string temp;
   temp = a;
   a = b;
   b = temp;
}
&lt;/pre&gt;
&lt;br /&gt;
Bunun gibi oluşturduğumuz Person sınıfındaki 2 nesneyi birbirine atamamız gerekebilir. Bu tip durumlarda sınıfımıza hep yeni bir metot yazmak zorunda kalıcaz. Bunun yerine generic bir metot yazabiliriz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;static void Swap&amp;lt;T&amp;gt;(ref T a, ref T b)
{
   T temp;
   temp = a;
   a = b;
   b = temp;
}
&lt;/pre&gt;
&lt;br /&gt;
Şu şekilde artık tek metot üzerinden Swap işlemimizi yapabiliriz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;
//int ile Swap
int a = 1;
int b = 2;
Swap&amp;lt;int&amp;gt;(ref a, ref b);

//string ile Swap
string s1 = &quot;Ahmet&quot;;
string s2 = &quot;Mehmet&quot;;
Swap&amp;lt;string&amp;gt;(ref s1, ref s2);
&lt;/pre&gt;
&lt;br /&gt;
Şimdi birde generic bir sınıf tasarlayalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        public class Point&amp;lt;T&amp;gt;
        {
            // noktamizin x,y koordinatlari
            private T xPos;
            private T yPos;
            // constructor.
            public Point(T xVal, T yVal)
            {
                xPos = xVal;
                yPos = yVal;
            }
            // Generic properties.
            public T X
            {
                get { return xPos; }
                set { xPos = value; }
            }
            public T Y
            {
                get { return yPos; }
                set { yPos = value; }
            }
            public void ResetPoint()
            {
                //default T tipinin default degerini dondurur
                //T int olursa 0, string olursa null gibi
                X = default(T);
                Y = default(T);
            }
        }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi Point sınıfı tanımladık ve bu Point sınıfının içerisine ise X,Y koordinatları tanımladık. Fakat generic bir sınıf tanımı yaptığımız için bu koordinatların tipini önceden tanımlamadık. Bu sınıfı kullanan client isterse int tipinden Point nesnesi oluşuturur bu durumda X,Y kordinatları int tipinden olur; isterse de double tipinden oluşturur bu durumda da X,Y koordinatları double tipinden olur.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    // int ile Point
    Point&amp;lt;int&amp;gt; p = new Point&amp;lt;int&amp;gt;(10, 10);
    // double ile Point
    Point&amp;lt;double&amp;gt; p2 = new Point&amp;lt;double&amp;gt;(5.4, 3.3);
&lt;/pre&gt;
&lt;br /&gt;
Burada &lt;b&gt;default &lt;/b&gt;keywordu dikkatinizi çekmiş olabilir: default keyword&#39;u kod commenti olarak yazdığımız gibi tipin default değerini döndürür. int için 0, string için null gibi.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;where T : &amp;lt;ifade&amp;gt; Kullanımı:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Generic yapısını kurarken T için bazı kısıtlamalar koyabiliriz. Bunun için &quot;where T : &amp;lt;ifade&amp;gt;&quot; yapısı kullanılır:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;where T : struct&lt;/b&gt; &amp;nbsp;= T&#39;nin System.ValueType tipinde olması gerektiğini belirtmek için kullanılır.&lt;br /&gt;
&lt;b&gt;where T : class&lt;/b&gt; &amp;nbsp; = T&#39;nin System.ValueType tipinde olmaması gerektiğini belirtmek için kullanılır. &lt;br /&gt;
&lt;b&gt;where T : new() &lt;/b&gt;&amp;nbsp;= T&#39;nin default constructor&#39;ının olması gerektiğini belirtmek için kullanılır.&lt;br /&gt;
&lt;b&gt;where T : NameOfBaseClass&lt;/b&gt; = NameOfBaseClass yerine bir sınıf ismi yazılır ve T&#39;nin bundan türemiş olması gerektiğini belirtmek için kullanılır.&lt;br /&gt;
&lt;b&gt;where T : NameOfInterface&lt;/b&gt; = NameOfInterface yerine interface ismi yazılır ve T&#39;nin bu interface&#39;i veya interfaceleri implemente etmiş olması gerekir. Birden fazla interface yazılabilir.&lt;/blockquote&gt;
Örnek kullanımına bakarsak:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;public class MyGenericClass&amp;lt;T&amp;gt; where T : class, IDrawable, new()
&lt;/pre&gt;
&lt;br /&gt;
Umarım yararlı olmuştur. Görüşmek üzere.</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/2741767841280541580/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-generic-liste-sinif-yaplari.html#comment-form' title='3 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/2741767841280541580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/2741767841280541580'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-generic-liste-sinif-yaplari.html' title='C# Generic Liste-Sınıf Yapıları'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhA7dnavLEjFESn60NOUnZpmgM4Xt_oxGbQ1oqFzJd_9xGXlWitNpWr10DgXbxy4UNNFgzTEg4Txa1VgfIW7peSBIUDXJXBxDV-QwLnj68m36pNUUF8v3VrX1pgGDj3mzpfRGRpvAmzUc/s72-c/cupt.jpg" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-3565245095139138687</id><published>2013-12-09T00:13:00.000+02:00</published><updated>2013-12-09T00:13:32.652+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="IComparer"/><category scheme="http://www.blogger.com/atom/ns#" term="IComperable"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# IComperable, IComparer Ara Yüzleri ve Kullanımı</title><content type='html'>&lt;b&gt;IComparable &lt;/b&gt;interface&#39;i uygulandığı sınıfa &lt;b&gt;CompareTo &lt;/b&gt;adlı bir metot kazandırır ve bu metot geriye int tipinde bir değer döndürür. IComparable interface&#39;ini sınıfımıza uygulayarak sınıfımızdan türeyen nesneleri karşılaştırılabilir hale getiririz ve böylece sıralama, karşılaştırma vb. işlemleri yapabiliriz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;// This interface allows an object to specify its
// relationship between other like objects.
public interface IComparable
{
  int CompareTo(object o);
}
&lt;/pre&gt;
&lt;br /&gt;
Örnek olarak bir integer dizimiz olsun bunu Array sınıfının static Sort metodu ile sıralayalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;int[] sayilar = { 4, 7, 1, 3, 2, 6, 5, 8 };
Array.Sort(sayilar);
 
foreach (int sayi in sayilar)
{
        Console.WriteLine(sayi);
}
&lt;/pre&gt;
&lt;br /&gt;
Kodumuzu çalıştırdığımızda hatasız bir şekilde sıralı listeyi elde ederiz.&lt;br /&gt;
&lt;br /&gt;
Peki bu sefer bir Car sınıfı oluşturalım ve ardından bir car dizisi oluşturup bu diziyi sıralamaya çalışalım bakalım ne olacak:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;class Car
    {
        public int CarId { get; set; }
        public string Brand { get; set; }
        public string Model { get; set; }
    }
class Program
    {
        static void Main(string[] args)
        {
            Car[] carList = new Car[3];
            carList[0] = new Car() 
                { CarId = 3, Brand = &quot;Opel&quot;, Model = &quot;Astra&quot; };
            carList[1] = new Car() 
                { CarId = 1, Brand = &quot;Opel&quot;, Model = &quot;Corsa&quot; };
            carList[2] = new Car() 
                { CarId = 2, Brand = &quot;Opel&quot;, Model = &quot;Insignia&quot; };

            Array.Sort(carList);

            foreach (Car item in carList)
            {
                Console.WriteLine(&quot;CarID: {0}, Brand: {1}, Model: {2}&quot;
                    , item.CarId, item.Brand, item.Model);
            }
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Bu kodu çalıştırdığımızda aşağıdaki hatayı alırız:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;color: red;&quot;&gt;“Failed to compare two elements in the array.”&lt;/span&gt;&lt;/blockquote&gt;
Çünkü dizimizi sort metoduna gönderdik fakat bu nesnenin hangi kurallara göre karşılaştırılacağını belirtmedik. Peki ilk örneğimizde de int tipinin nasıl karşılaştıracağını belirtmemiştik onda neden hata almadık? Çünkü Int32 sınıfı &amp;nbsp;&lt;b&gt;IComperable &lt;/b&gt;interface&#39;ini implemente etmektedir bu yüzden sayılar aritmetik sırayla sıralanmıştır. O zaman kodumuzun çalışması için bizimde Car sınıfının &lt;b&gt;IComperable &lt;/b&gt;interface&#39;ini implemente etmesini sağlamamız gerekiyor. Şimdi buna göre Car sınıfını yeniden yazalım :&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;class Car: IComparable
    {
        public int CarId { get; set; }
        public string Brand { get; set; }
        public string Model { get; set; }

        public int CompareTo(object obj)
        {
            Car temp = obj as Car;
            if (temp != null)
            {
                if (this.CarId &amp;gt; temp.CarId)
                    return 1;
                if (this.CarId &amp;lt; temp.CarId)
                    return -1;
                else
                    return 0;
            }
            else
                throw new ArgumentException(&quot;Car nesnesi degil!&quot;);
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;CompareTo Dönüş Değerlerinin Anlamları:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;0&#39;dan küçük ise :&lt;/b&gt; nesneden önce geliyor&lt;br /&gt;
&lt;b&gt;0 ise :&lt;/b&gt; o anki nesne&lt;br /&gt;
&lt;b&gt;0&#39;dan büyük ise:&lt;/b&gt; nesneden sonra geliyor&lt;br /&gt;
&lt;br /&gt;
Yukarıdaki logic&#39;e uygun CarId property&#39;sine göre sıralama yapan bir &lt;b&gt;CompareTo &lt;/b&gt;metodu yazdık. Artık Array.Sort metoduna dizimizi gönderirsek CarId&#39;ye göre sıralama yapacaktır.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6ntGLA5mFqr7c6O9TPyhAtMTnVXOxQSlXuJEilwbpfxJQq9PlAPS3xin2GtGqH7YvKjMGlIHCW644uAYsP-f0mHoQUSN0fuCE9ZM1ffVAdjcoABf8-iquKKyRMJ9ugsTgmcE0vrAiQzU/s1600/icomperable_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6ntGLA5mFqr7c6O9TPyhAtMTnVXOxQSlXuJEilwbpfxJQq9PlAPS3xin2GtGqH7YvKjMGlIHCW644uAYsP-f0mHoQUSN0fuCE9ZM1ffVAdjcoABf8-iquKKyRMJ9ugsTgmcE0vrAiQzU/s1600/icomperable_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Bir adım daha ileri gidelim ve düşünün ki bazen nesnenizi CarId&#39;ye göre bazen Brand ismine göre bazende Model ismine göre sıralamanız gerekiyor. Bu durumda ne yapabiliriz? Array sınıfının static sort metodu ilk parametre olarak dizi ikinci parametre olarakta &lt;b&gt;IComparer &lt;/b&gt;tipinde değişken alabiliyor. Yani kendi custom comparer&#39;larımızı yazarsak bunu gerçekleştirebiliriz. Yazdığımız custom comperarımız IComparer interface&#39;ini implemente etmesi gerekiyor ve bu implementasyon &lt;b&gt;Compare &lt;/b&gt;metodunu sınıfımıza ekliyor. Şimdi örnek olarak Model ismine göre sıralayan comparer&#39;ımızı yazalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;class CarModelComparer : IComparer
    {
        public int Compare(object x, object y)
        {
            Car t1 = x as Car;
            Car t2 = y as Car;
            if (t1 != null &amp;amp;&amp;amp; t2 != null)
                return String.Compare(t1.Model, t2.Model);
            else
                throw new ArgumentException(&quot;Car nesnesi degil!&quot;);
        }
    }

&lt;/pre&gt;
Bunun ardından aşağıdaki gibi sort işlemini gerçekleştirirsek:
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;            //Model ismine gore siralaniyor
            Array.Sort(carList, new CarModelComparer());

            foreach (Car item in carList)
            {
                Console.WriteLine(&quot;CarID: {0}, Brand: {1}, Model: {2}&quot;
                    , item.CarId, item.Brand, item.Model);
            }
&lt;/pre&gt;
&lt;br /&gt;
Artık foreach ile döndüğümüzde nesne örnekleri Model ismi sırasına göre gelecektir. Bu şekildeki iterasyon sonrası çıktı şu şekilde olacaktır:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG3JV4UAV7glJ9-NnGcAdo8I2Qxpo83JfOf7poYZ44ZlvlOxPnxYt3lFWu0SO-8bCKs9dlF8ip-W9kurVIVJWOtKVfRDiOs3vz4hkRoYCam1d8a6bL2tprr54oSDcTIB0UC4qXpQMIUtU/s1600/icomperable_ss2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG3JV4UAV7glJ9-NnGcAdo8I2Qxpo83JfOf7poYZ44ZlvlOxPnxYt3lFWu0SO-8bCKs9dlF8ip-W9kurVIVJWOtKVfRDiOs3vz4hkRoYCam1d8a6bL2tprr54oSDcTIB0UC4qXpQMIUtU/s1600/icomperable_ss2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
İstersek sınıflarımıza IComparer tipinde property ekleyerek sınıfımıza değişik biçimlerde sort işlemi yaptıracak özellikler kazandırabiliriz. new şeklinde comparer oluşturmak yerine bunu kullanmak hem kullanım kolaylığı sağlayacaktır hemde son kullanıcı oluşturduğu nesneyi nelere göre sıralayabilecek bunu görecektir.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        public static IComparer SortByModel
        { get { return (IComparer)new CarModelComparer(); } }

        Array.Sort(carList, Car.SortByModel);
&lt;/pre&gt;
&lt;br /&gt;
Örnek Proje : &lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/IComparableExample.rar&quot;&gt;IComparableExample.rar&amp;nbsp;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/3565245095139138687/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-icomperable-icomparer-ara-yuzleri.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/3565245095139138687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/3565245095139138687'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-icomperable-icomparer-ara-yuzleri.html' title='C# IComperable, IComparer Ara Yüzleri ve Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6ntGLA5mFqr7c6O9TPyhAtMTnVXOxQSlXuJEilwbpfxJQq9PlAPS3xin2GtGqH7YvKjMGlIHCW644uAYsP-f0mHoQUSN0fuCE9ZM1ffVAdjcoABf8-iquKKyRMJ9ugsTgmcE0vrAiQzU/s72-c/icomperable_ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-1271210111033529839</id><published>2013-12-08T22:20:00.000+02:00</published><updated>2013-12-17T20:37:50.222+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Lazy Object Instantiation"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Lazy Obje Örnekleme (Lazy Object Instantiation)</title><content type='html'>Bir sınıf yarattığımızda bir çok eleman ekleriz fakat client tarafından bu elemanlar&amp;nbsp;belkide hiç çağırılmayacaktır. Özellikle bu eleman büyük bir dataya sahipse kullanılmadığı halde her nesne yaratıldığında bellekte yer kaplayacaktır.&lt;br /&gt;
&lt;br /&gt;
Örnek olarak bir MediaPlayer yazdığımızı düşünelim: Play, Pause, Stop metodları olsun MediaPlayer sınıfımızın bir de MediaPlayer&#39;ımızın içerisindeki song objelerini tuttan bir AllTrack adında collection property&#39;imiz olsun.&lt;br /&gt;
&lt;br /&gt;
İlk hetapta&lt;b&gt; Lazy&amp;nbsp;Object Instantiation&lt;/b&gt; kullanmadan tasarlayalım MediaPlayer sınıfımızı:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;class Song
    {
        public string Artist { get; set; }
        public string TrackName { get; set; }
        public double TrackLength { get; set; }
    }
class MediaPlayer
    {
        public void Play() { Console.WriteLine(&quot;Playing the song.&quot;); }
        public void Pause() { Console.WriteLine(&quot;Paused the song.&quot;); }
        public void Stop() { Console.WriteLine(&quot;Stoped the song.&quot;); }
        public List&amp;lt;song&amp;gt; AllTracks { get; set; }

        public MediaPlayer()
        {
            GetAllTracks();
        }

        private void GetAllTracks()
        {
            AllTracks.Add(new Song() { Artist = &quot;Duman&quot;
                   , TrackName = &quot;Ah&quot;, TrackLength = 3.1 });
            AllTracks.Add(new Song() { Artist = &quot;Mor ve Ötesi&quot;
                   , TrackName = &quot;Cambaz&quot;, TrackLength = 4.6 });
            AllTracks.Add(new Song() { Artist = &quot;Kuban&quot;
                   , TrackName = &quot;Yobaz&quot;, TrackLength = 3.5 }); 
        }
    }

 class Program
    {
        static void Main(string[] args)
        {
            MediaPlayer player = new MediaPlayer();
            // play ve stop metodlarini cagirip
            // programimizi bitirdik fakat
            // AllTracks bosuna yÃ¼klendi
            player.Play();
            player.Stop();
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi sadece Play ve Stop işleri yapılmasına rağmen tüm AllTrack listesi yüklendi. Programımızı şimdi birde&amp;nbsp;&lt;b&gt;Lazy&amp;nbsp;Object Instantiation &lt;/b&gt;kullanarak yazalım bakalım nasıl bir değişiklik olacak:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;class Song
    {
        public string Artist { get; set; }
        public string TrackName { get; set; }
        public double TrackLength { get; set; }
    }
    class MediaPlayer
    {
        public void Play() { Console.WriteLine(&quot;Playing the song.&quot;); }
        public void Pause() { Console.WriteLine(&quot;Paused the song.&quot;); }
        public void Stop() { Console.WriteLine(&quot;Stoped the song.&quot;); }
        public Lazy&amp;lt;List&amp;lt;Song&amp;gt;&amp;gt; LazyAllTracks { get; set; }

        public MediaPlayer()
        {
            LazyAllTracks = new Lazy&amp;lt;List&amp;lt;Song&amp;gt;&amp;gt;(() =&amp;gt; GetAllTracks());
        }

        private List&amp;lt;Song&amp;gt; GetAllTracks()
        {
            List&amp;lt;Song&amp;gt; allTracks = new List&amp;lt;Song&amp;gt;();
            allTracks.Add(new Song() 
                { Artist = &quot;Duman&quot;, TrackName = &quot;Ah&quot;
                   , TrackLength = 3.1 });
            allTracks.Add(new Song() 
                { Artist = &quot;Mor ve Ötesi&quot;
                , TrackName = &quot;Cambaz&quot;, TrackLength = 4.6 });
            allTracks.Add(new Song() 
                { Artist = &quot;Kuban&quot;, TrackName = &quot;Yobaz&quot;
                    , TrackLength = 3.5 });
            return allTracks;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MediaPlayer player = new MediaPlayer();
            Console.WriteLine(&quot;Sarki listesi yuklendi mi? {0}&quot;
              , player.LazyAllTracks.IsValueCreated ? &quot;Evet&quot; : &quot;Hayır&quot;);
            player.Play();
            player.Stop();
            Console.WriteLine(&quot;Sarki listesi yuklendi mi {0}&quot;
              , player.LazyAllTracks.IsValueCreated ? &quot;Evet&quot; : &quot;Hayır&quot;);
            foreach (Song song in player.LazyAllTracks.Value)
            {
                
            }
            Console.WriteLine(&quot;Sarki listesi yuklendi mi {0}&quot;
              , player.LazyAllTracks.IsValueCreated ? &quot;Evet&quot; : &quot;Hayır&quot;);
            Console.ReadLine();
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Yukarıdaki kodla ilgili olarak &lt;b&gt;Lazy&amp;lt;T&amp;gt;&lt;/b&gt; nesne örneğinin &lt;b&gt;IsValueCreated &lt;/b&gt;property&#39;si track listesinin dolup dolmadığını anlamamızı sağlar.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPAXgFWJSBAJr_qOlKjKlgVN6mJYXsvwC1S59eoGMB72thpY_G6j_-CTzs79U36uw00OjDUmmNIsyJU73niKMFboaYkW0fww3LzCcRH45OAd4P5236QnWPkC7l4T7oN5XM59laDQgRl3w/s1600/lazy_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPAXgFWJSBAJr_qOlKjKlgVN6mJYXsvwC1S59eoGMB72thpY_G6j_-CTzs79U36uw00OjDUmmNIsyJU73niKMFboaYkW0fww3LzCcRH45OAd4P5236QnWPkC7l4T7oN5XM59laDQgRl3w/s1600/lazy_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
Programımızın çıktısından anlaşılabileceği gibi MediaPlayer nesne örneği oluşturduğumuzda şarkı listesi oluşmadı. Ardından Play ve Stop metodlarını çalıştırdık ve hala liste oluşmadı. Sonra foreach içerisinde&amp;nbsp;&lt;b&gt;Lazy&amp;lt;T&amp;gt;&lt;/b&gt;&amp;nbsp;nesne örneğinin value property&#39;si istendi ve bununla birlikte liste oluştu. Kısacası liste istemci tarafından istenene kadar oluşturulmadı.&lt;br /&gt;
&lt;br /&gt;
Lamda operatörü ile Lazy obje yaratılırken çalışacak extra işler yaptırabiliriz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;
// Use a lambda expression to add additional code
// when the AllTracks object is made.
private Lazy&lt;AllTracks&gt; allSongs = new Lazy&lt;AllTracks&gt;( () =&gt;
{
     Console.WriteLine(&quot;Creating AllTracks object!&quot;);
     return new AllTracks();
});
&lt;/pre&gt;
&lt;br /&gt;
Örnek Proje:&amp;nbsp;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/LazyObjectInstantiation.rar&quot;&gt;LazyObjectInstantiation.rar&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/1271210111033529839/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-lazy-object-instantiation.html#comment-form' title='1 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/1271210111033529839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/1271210111033529839'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-lazy-object-instantiation.html' title='C# Lazy Obje Örnekleme (Lazy Object Instantiation)'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPAXgFWJSBAJr_qOlKjKlgVN6mJYXsvwC1S59eoGMB72thpY_G6j_-CTzs79U36uw00OjDUmmNIsyJU73niKMFboaYkW0fww3LzCcRH45OAd4P5236QnWPkC7l4T7oN5XM59laDQgRl3w/s72-c/lazy_ss.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-4503897824652755828</id><published>2013-12-08T20:17:00.002+02:00</published><updated>2013-12-08T21:00:23.122+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="IEnumerable"/><category scheme="http://www.blogger.com/atom/ns#" term="IEnumerator"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><category scheme="http://www.blogger.com/atom/ns#" term="Yield"/><title type='text'>C# Yield Sözcüğü Kullanımı</title><content type='html'>Başlamadan daha önce okumadıysanız &lt;a href=&quot;http://safakunel.blogspot.com/2013/12/c-ienumerable-ienumerator-ara-yuzleri.html&quot;&gt;C# IEnumerable, IEnumerator Ara yüzleri ve Kullanımı&lt;/a&gt;&amp;nbsp;yazısını okumanızı tavsiye ederim. Çünkü bu yazıda bir çok yerde bu yazıdan referans alacağız.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://safakunel.blogspot.com/2013/12/c-ienumerable-ienumerator-ara-yuzleri.html&quot;&gt;C# IEnumerable, IEnumerator Ara yüzleri ve Kullanımı&lt;/a&gt;&amp;nbsp;yazısında bahsettiğimiz gibi bir sınıfımızın iterator özelliği kazanabilmesi için &lt;b&gt;IEnumerable &lt;/b&gt;veya &lt;b&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/b&gt; interfacelerini implemente etmesi gerekmektedir.&lt;br /&gt;
&lt;br /&gt;
Bu interface, uygulandığı sınıfa &lt;b&gt;GetEnumerator &lt;/b&gt;adlı bir metot kazandırır ve bu metot geriye &lt;b&gt;IEnumerator &lt;/b&gt;interface’ini implement eden bir sınıf döndürür.&lt;br /&gt;
&lt;br /&gt;
Yine aynı yazıda custom bir Enumerator sınıfı yazıp, IEnumerator interface&#39;ini implemente etmiştik. Bu implementasyonun ardından &lt;b&gt;MoveNext&lt;/b&gt;, &lt;b&gt;Reset &lt;/b&gt;adlı metotları ve readonly &lt;b&gt;Current &lt;/b&gt;property&#39;sini doldurmamız gerekmişti.&lt;br /&gt;
&lt;br /&gt;
Bunları yapmak oldukça basit olsada bazi durumlarda, uygulamaya entegrasyonu sorunlu olabiliyor veya zaman alabiliyor her seferinde bunları yazmak. Bu tip sıkıntıları gidermek için C# 2.0 ile &lt;b&gt;yield &lt;/b&gt;keyword&#39;ü gelmiştir. Yield ile bu işlemlerin tümü bizim için arka planda yapılıyor.&lt;br /&gt;
&lt;br /&gt;
Yield keyword’ünün iki farklı kullanım şekli bulunuyor:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
yield return &amp;lt;ifade&amp;gt;&lt;br /&gt;
yield break&lt;/blockquote&gt;
&lt;b&gt;yield return &amp;lt;ifade&amp;gt; : &lt;/b&gt;Iterator’e çağrı yapan foreach döngüsüne bir eleman döndürülürken kullanılır.&lt;br /&gt;
&lt;b&gt;yield break: &lt;/b&gt;Mevcut&amp;nbsp;iterator içerisindeki iterasyonun sona erdiği bilgisini iterator’ı çağıran foreach döngüsüne iletmekte kullanılır.&lt;br /&gt;
&lt;br /&gt;
Şimdi bu ifadelerin daha açık olması için bir örnek üzerinden gidelim ve bir önceki yazımızda custom Enumerator sınıfı ile yazdığımız Alisveris Sepeti iterator örneği hatırlayalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    class Urun
    {
        public string Name { get; set; }
        public decimal Price { get; set; }
    }

    class AlisverisSepeti:IEnumerable
    {
        public Urun[] UrunListesi { get; set; }

        public AlisverisSepeti()
        {
            UrunListesi = new Urun[] 
            { 
                new Urun(){ Name=&quot;Bilgisayar&quot;, Price=1022.3m},
                new Urun(){ Name=&quot;Ipad&quot;, Price=699.9m}
            };
        }

        public IEnumerator GetEnumerator()
        {
            //return UrunListesi.GetEnumerator();
            return new AlisverisSepetiEnumerator(UrunListesi);
        }
    }

class AlisverisSepetiEnumerator:IEnumerator
    {
        private Urun[] _UrunList;
        int _curentIndex = -1;

        //itere edilecek liste aliniyor
        public AlisverisSepetiEnumerator(Urun[] urunList)
        {
            _UrunList = urunList;
        }

        //iterasyonda kalinan yer
        public object Current
        {
            get { return _UrunList[_curentIndex]; }
        }

        //bir sonraki adim var mi kontrolu
        public bool MoveNext()
        {
            return ++_curentIndex &amp;lt; _UrunList.Length;
        }

        //iterasyon basa alinir
        public void Reset()
        {
            _curentIndex = -1;
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi AlisverisSepetiEnumerator sınıfı oluşturup IEnumerator interface&#39;ini implemente etmiştik. Peki bunu yield ile nası yazarız? Artık custum olarak yazdığımız enumerator sınıfı AlisverisSepetiEnumerator&#39;a gerek yok tek yapmamız gereken:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        public IEnumerator GetEnumerator()
        {
            for (int i = 0; i &amp;lt; UrunListesi.Length; i++)
            {
                yield return UrunListesi[i];
            }
        }&lt;/pre&gt;
Normalde bilirsiniz ki bir metod birden fazla return yapamaz fakat return&#39;ün başına yield koyduğumuzda ne oluyorda yapabiliyor? Compiler yield keyword&#39;ünü gördüğünde bunun bir iterator bloğu olduğunu anlıyor ve bizim yerimize&amp;nbsp;MoveNext,Reset ve Current öğelerini yaratıp içlerini dolduruyor.&lt;br /&gt;
&lt;br /&gt;
Yani artık custom bir enumerator sınıfı yazmamıza gerek yok yield keyword&#39;ü ile compiler bunu arka planda bizim için yapıyor.&lt;br /&gt;
&lt;br /&gt;
ildasm.exe ile programımızın exe dosyasını açarsak bunu açıkça görebiliriz:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzf89jUaJuOcnDAy-DcwgMdhz8bsRprfMBpmZp6cV8Weo9oON6EJ8T4bBqG0mAJPTM1uqNHA5ZsjSE_qZoUpCHecaQHF7Qz1vXo94daGEkUEUgDtoIsjOmaE_MurY8DDU0F45mKLDR5jw/s1600/yield_ildasm_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzf89jUaJuOcnDAy-DcwgMdhz8bsRprfMBpmZp6cV8Weo9oON6EJ8T4bBqG0mAJPTM1uqNHA5ZsjSE_qZoUpCHecaQHF7Qz1vXo94daGEkUEUgDtoIsjOmaE_MurY8DDU0F45mKLDR5jw/s640/yield_ildasm_ss.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Yield ile kendimiz named iteretor&#39;ler oluşturabiliriz. Örneğin programımızın 750TL den daha pahalı ürünleri getirmesini istiyoruz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        public IEnumerable GetHighPriceList()
        {
            for (int i = 0; i &amp;lt; UrunListesi.Length; i++)
            {
                if(UrunListesi[i].Price &amp;gt; 750m)
                    yield return UrunListesi[i];
            }
        }
&lt;/pre&gt;
&lt;br /&gt;
foreach içerisinde yukardaki örnekte foreach(Urun item in sepetim) şeklinde yazmıştık. Bu durumda sepetim nesnesinin içerisindeki elemanları çekmek için foreach GetEnumerator metodunu çağırmaktadır. Yukarda aslında kendi GetEnumerator sınıfımızı yazmış olduk artık sepetim.GetHighPriceList() şeklinde foreach içerisine yazarsak artık&amp;nbsp;GetEnumerator metodu yerine GetHighPriceList metodu çağırılacaktır ve bu nedenle iterasyon artık bu metodun döndürdüğü elemanlar içerisinde olacaktır.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;             // default GetEnumerator yerine
             // GetHighPriceList metodu calistirilacak
             foreach (Urun urun in sepetim.GetHighPriceList())
             {
                 Console.WriteLine(&quot;Urun: {0}, Fiyat: {1}&quot;
                     , urun.Name, urun.Price);
             }
&lt;/pre&gt;
&lt;br /&gt;
Programımızın çıktısı şu şekilde olacaktır:



&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUzNSxldfeMCZLzb2czlkSXCLl5O1raauJmmc7IBWMa0adjR4dhmliEaeKMeUhibfk8bsQRWCbRosef_rRVkfReiTcQlYshK0-X2yt0jHwD5WsX3VZ4uZ1lPU6nkEN3sJd-f_-QiGEXsk/s1600/yield_Ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUzNSxldfeMCZLzb2czlkSXCLl5O1raauJmmc7IBWMa0adjR4dhmliEaeKMeUhibfk8bsQRWCbRosef_rRVkfReiTcQlYshK0-X2yt0jHwD5WsX3VZ4uZ1lPU6nkEN3sJd-f_-QiGEXsk/s1600/yield_Ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Örnek program:&amp;nbsp;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/IEnumerableWithYield.rar&quot;&gt;IEnumerableWithYield.rar&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/4503897824652755828/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-yield-sozcugu-kullanimi.html#comment-form' title='2 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/4503897824652755828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/4503897824652755828'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-yield-sozcugu-kullanimi.html' title='C# Yield Sözcüğü Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzf89jUaJuOcnDAy-DcwgMdhz8bsRprfMBpmZp6cV8Weo9oON6EJ8T4bBqG0mAJPTM1uqNHA5ZsjSE_qZoUpCHecaQHF7Qz1vXo94daGEkUEUgDtoIsjOmaE_MurY8DDU0F45mKLDR5jw/s72-c/yield_ildasm_ss.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-5244349850621386153</id><published>2013-12-08T17:51:00.001+02:00</published><updated>2013-12-08T17:58:11.703+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="IEnumerable"/><category scheme="http://www.blogger.com/atom/ns#" term="IEnumerator"/><category scheme="http://www.blogger.com/atom/ns#" term="Iterasyon"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# IEnumerable, IEnumerator Ara yüzleri ve Kullanımı</title><content type='html'>C#&#39;ta iterator kavramını düşündüğümüzde tahmin ediyorum ki aklınıza gelen ilk yapı &lt;b&gt;foreach &lt;/b&gt;yapısıdır. foreach ile bir koleksiyon ya da array üzerinde gezinerek elemanlarına ulaşabiliyoruz. foreach arkaplanda iterator yapısını kullanır.&lt;br /&gt;
&lt;br /&gt;
Bugün inceliyeceğimiz konu biz yazdığımız bir sınıf içerisindeki elemanları foreach ile gezmek istesek ne yapmamız gerekiyor? Örneğin AlisverisSepeti diye bir sınıf oluşturduk bu sınıfın içerisinde Urun nesneleri var bu nesneleri foreach ile itere etmek istiyoruz ne yapmamız gerekiyor?&lt;br /&gt;
&lt;br /&gt;
İlk aklımıza gelen şekilde programımızı bir yazalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    public class Urun
    {
        public string Name { get; set; }
        public decimal Price { get; set; }
    }

    public class AlisverisSepeti
    {
        public Urun[] UrunListesi { get; set; }

        public AlisverisSepeti()
        {
            UrunListesi = new Urun[] 
            { 
                new Urun(){ Name=&quot;Bilgisayar&quot;, Price=1022.3m},
                new Urun(){ Name=&quot;Ipad&quot;, Price=699.9m}
            };
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            AlisverisSepeti sepetim = new AlisverisSepeti();

            foreach (Urun urun in sepetim)
            {
                Console.WriteLine(&quot;Urun: {0}, Fiyat: {1}&quot;
                       , urun.Name, urun.Price); 
            }
        }
    }&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Gördüğünüz gibi bir AlisverisSepeti sınıfı oluşturduk ve bu sınıf içerisindeki Urun listesine bir takım ürünler attık. Daha sonra ise alisveris sepetimizi foreach ile gezmeye çalıştık ama bu durumda bu mümkün değil. Böyle bir tasarım yaparsak aşağıdaki hatayı alırız:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;color: red;&quot;&gt;foreach statement cannot operate on variables of type &#39;IteratorsExample.AlisverisSepeti&#39; because &#39;IteratorsExample.AlisverisSepeti&#39; does not contain a public definition for &#39;GetEnumerator&#39;&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
Bu sınıfımızın iterator özelliği kazanması için&amp;nbsp;&lt;b&gt;IEnumerable veya&amp;nbsp;&lt;/b&gt;&lt;b&gt;IEnumerable&amp;lt;T&amp;gt;&amp;nbsp;&lt;/b&gt;interfacelerini implemente etmesi gerekmektedir. Bu interface, uygulandığı sınıfa &lt;b&gt;GetEnumerator &lt;/b&gt;adlı bir metot kazandırır ve bu metot geriye &lt;b&gt;IEnumerator &lt;/b&gt;interface’ini implement eden bir sınıf döndürür. Bir sınıf üzerinde foreach ile dönebilmemiz için bu sınıfın GetEnumerator metodunun olması gerekmektedir.&lt;br /&gt;
&lt;br /&gt;
Şimdi AlisverisSepeti&amp;nbsp;sınıfımızı IEnumerable interface&#39;ini implemente edecek şekilde değiştirelim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    class AlisverisSepeti:IEnumerable
    {
        public Urun[] UrunListesi { get; set; }

        public AlisverisSepeti()
        {
            UrunListesi = new Urun[] 
            { 
                new Urun(){ Name=&quot;Bilgisayar&quot;, Price=1022.3m},
                new Urun(){ Name=&quot;Ipad&quot;, Price=699.9m}
            };
        }

        public IEnumerator GetEnumerator()
        {
            throw new NotImplementedException();
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
Gördüğünüz gibi IEnumerable interface&#39;ini Alisveris sınıfımıza implemente ettiğimizde IDE&#39;miz bize IEnumerator döndüren GetEnumerator isimli bir metot yazmamış gerektiğini söyledi. Örneğimizde bu metodu yazabilmemiz için IEnumerator interface&#39;ini implemente etmiş AlisverisSepetiEnumerator sınıfını yazmamız gerekecek. IEnumerator interface&#39;i ise uygulandığı sınıfa&amp;nbsp;&lt;b&gt;MoveNext,&amp;nbsp;Reset&amp;nbsp;&lt;/b&gt;adlı bir metotları ve readonly &lt;b&gt;Current &lt;/b&gt;property&#39;sini&lt;b&gt;&amp;nbsp;&lt;/b&gt;kazandırır.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    class AlisverisSepetiEnumerator:IEnumerator
    {
        public object Current
        {
            get { throw new NotImplementedException(); }
        }

        public bool MoveNext()
        {
            throw new NotImplementedException();
        }

        public void Reset()
        {
            throw new NotImplementedException();
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp;Şimdi bu implementasyonumuzu gerçekleştirelim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    class AlisverisSepetiEnumerator:IEnumerator
    {
        private Urun[] _UrunList;
        int _curentIndex = -1;

        //itere edilecek liste aliniyor
        public AlisverisSepetiEnumerator(Urun[] urunList)
        {
            _UrunList = urunList;
        }

        //iterasyonda kalinan yer
        public object Current
        {
            get { return _UrunList[_curentIndex]; }
        }

        //bir sonraki adim var mi kontrolu
        public bool MoveNext()
        {
            return ++_curentIndex &amp;lt; _UrunList.Length;
        }

        //iterasyon basa alinir
        public void Reset()
        {
            _curentIndex = -1;
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
AlisverisSepeti sınıfımız için custum bir Enumerator yazdığımıza göre artık GetEnumerator metodumuzu düzenleyebiliriz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        public IEnumerator GetEnumerator()
        {
            return new AlisverisSepetiEnumerator(UrunListesi);
        }
&lt;/pre&gt;
&lt;br /&gt;
Bu son değişikliğin ardında artık AlisverisSepeti sınıfımız itere edilebilir hale geldi programımızın çıktısı şu şekilde olacak:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJl6KTO4850v7t_gcdwmR7cn8z3HiFKV4q2pWOvvwPuSUrnFk5Y9TtQFmq3PYtqL8S2Ik2CZq3vAcE5pOkA0Ww6eaOV21UqzWqLOtvBjkKKnqZUMoKCnEtfSJCsVKn077Y9-K7kp9L9_Y/s1600/ienumerable_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJl6KTO4850v7t_gcdwmR7cn8z3HiFKV4q2pWOvvwPuSUrnFk5Y9TtQFmq3PYtqL8S2Ik2CZq3vAcE5pOkA0Ww6eaOV21UqzWqLOtvBjkKKnqZUMoKCnEtfSJCsVKn077Y9-K7kp9L9_Y/s1600/ienumerable_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Bu programda kullandığımız sepetimizdeki urunleri tutan Urun[] collection&#39;ı itere edilebilir bir yapıda olduğu için kendi içerisinde tanımlanmış GetEnumerator metodu bulunmaktadır. Bu yüzden manuel olarak Enumerator sınıfı yazmak yerine UrunListesi.GetEnumerator() şeklinde çağırarak bu iterasyon işlemini gerçekleştirebilirdik. Yukarıdaki örneğimizi bu metodu olmayan nesneleri manuel nasıl itere edebileceğimizi göstermek için verdik. Daha kolay bir şekilde şöyle gerçekleştirebilirdik:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;        public IEnumerator GetEnumerator()
        {
            return UrunListesi.GetEnumerator();
            //return new AlisverisSepetiEnumerator(UrunListesi);
        }
&lt;/pre&gt;
&lt;br /&gt;
IEnumerator interface&#39;inin birde generic hali IEnumerator&amp;lt;T&amp;gt; bulunmakta bunu ilerleyen yazılarımızda inceleyeceğiz.&lt;br /&gt;
&lt;br /&gt;
Örnek Proje:&amp;nbsp;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/89900653/Codes/IEnumerableExample.rar&quot;&gt;IEnumeratorExample.rar&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/5244349850621386153/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-ienumerable-ienumerator-ara-yuzleri.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/5244349850621386153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/5244349850621386153'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-ienumerable-ienumerator-ara-yuzleri.html' title='C# IEnumerable, IEnumerator Ara yüzleri ve Kullanımı'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJl6KTO4850v7t_gcdwmR7cn8z3HiFKV4q2pWOvvwPuSUrnFk5Y9TtQFmq3PYtqL8S2Ik2CZq3vAcE5pOkA0Ww6eaOV21UqzWqLOtvBjkKKnqZUMoKCnEtfSJCsVKn077Y9-K7kp9L9_Y/s72-c/ienumerable_ss.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-7948226193419114972</id><published>2013-12-06T10:48:00.000+02:00</published><updated>2013-12-08T01:49:16.168+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Chain of Responsibility Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Chain of Responsibility Tasarım Deseni"/><category scheme="http://www.blogger.com/atom/ns#" term="Design Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Object Oriented Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Chain of Responsibility Pattern Kullanımı - OOP Design Pattern</title><content type='html'>Chain of Responsibility (Sorumluluk Zinciri) tasarım deseni behavior grubununa ait, bir isteğin belli sınıflar içinde gezdirilerek ilgili sınıfın işlem yapmasını yöneten tasarım desenidir. Chain of responsibility tasarım deseninin dofactory.com a göre kullanım sıklığı 40% lardadır.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm9qezHo3u3ME1r2JTo7UdzG0LpEZtYH3Fb1S-okKNBrACFlRXsoJKO5tvXkNK53TUAe08Ib5ipjYY4kzy0eQTU0mnQL841g7a8pJl32RJ3OdpvVUvzdb0NtVw6Yngu2z8cfAyW0cSqKY/s1600/chain.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;150&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm9qezHo3u3ME1r2JTo7UdzG0LpEZtYH3Fb1S-okKNBrACFlRXsoJKO5tvXkNK53TUAe08Ib5ipjYY4kzy0eQTU0mnQL841g7a8pJl32RJ3OdpvVUvzdb0NtVw6Yngu2z8cfAyW0cSqKY/s400/chain.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bu deseni anlamaya çalışırken bir çok nesne örneğinin Loosly Coupled (zayıf şekilde) bağlı olduğunu ve bunların bir zincir gibi dizildiğini düşünün. Personel, müdür, genel müdür gibi bir dizilimi buna örnek olarak verelebiliriz. Bir Workflow örneği düşünelim mesela: önce personel işi yapar, sonra müdürü onaylar, sonra genel müdür imza atar. Personel nesnesi işi tamamladıktan sonra işi müdür nesnesine gönderir. Daha sonra müdür nesnesi onaylama işini yapar ve işi genel müdür nesnesine gönderir ve böylece yapılacak iş zincirimizin son halkası olan genel müdür nesnesine gelmiştir ve genel müdür imzalama işini yaparak zinciri sonlandırır. Kısacası zincir içerisindeki nesne örnekleri söz konusu içeriği kendi işlerini yaptıktan sonra bir sonraki adıma gönderirler. Program çalışma mantığına göre istenilen bir yerde zincir sonlandırılabilir veya başa döndürülebilir.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Programlamada Event Based Programming&#39;de sıkça kullanılır. Bir event&#39;ın birden fazla nesne tarafından ele alınması gerektiği durumlarda bu deseni kullanabiliriz. Bu daha çok iç içe bileşenler içeren Form&#39; larda veya diğer taşıyıcı(Container) kontrollerde görebiliriz. Örneğin; tüm formlar için ortak olan bir event tetiklendiğinde, bir zincir şekilde tüm formlar bu event&#39;ı uygulamalıdır. Parent form -&amp;gt; Chield form 1 -&amp;gt; Chield form 2 şeklinde.&lt;br /&gt;
&lt;br /&gt;
Şİmdi örnek olarak basit bir personel izin sistemi yazalım. Engineer -&amp;gt; Program Manager -&amp;gt; HR şeklinde izin onaylama zincirimizin olduğunu düşünerek bir program yazalım:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UML Diagram:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzSkgeZhfBFmoxsjcFLcldB7CPDJq3Zm8P-lESHiqtdbXLyg2mIzfx2ExKT6W1_fQAd9-5EhtFl_SGqa-BVQ8ljaMwu7SAsGK9Lm8q32S4Stp7fOa169kcbTv0T0J2MfIypaIy3COn6Xc/s1600/chain_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;497&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzSkgeZhfBFmoxsjcFLcldB7CPDJq3Zm8P-lESHiqtdbXLyg2mIzfx2ExKT6W1_fQAd9-5EhtFl_SGqa-BVQ8ljaMwu7SAsGK9Lm8q32S4Stp7fOa169kcbTv0T0J2MfIypaIy3COn6Xc/s640/chain_ss.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Kod:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;pre class=&quot;c-sharp&quot; name=&quot;code&quot;&gt;    
    /// &amp;lt;summary&amp;gt;
    /// The &#39;Handler&#39; abstract class
    /// &amp;lt;/summary&amp;gt;
    public abstract class Employee
    {
        public Guid EmployeeId { get; set; }
        public int LeaveDays { get; set; }
        // approve edecek bir sonraki kisi
        public Employee NextApprover { get; set; }

        public Employee()
        {
            EmployeeId = Guid.NewGuid();
            LeaveDays = 15;
        }

        // Event tanimlaniyor
        public delegate void OnLeaveApplied(int requestedDays);
        public event OnLeaveApplied onLeaveApplied = null;

        public abstract void ApproveLeave(int requestedDays);

        // Using this we can apply for leave
        public void ApplyLeave(int requestedDays)
        {
            if (onLeaveApplied != null)
            {
                onLeaveApplied(requestedDays);
            }
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// The &#39;ConcreteHandler&#39; class
    /// &amp;lt;/summary&amp;gt;
    public class Engineer:Employee
    {
        public Engineer()
        {
            this.onLeaveApplied += Engineer_onLeaveApplied;
        }

        private void Engineer_onLeaveApplied(int requestedDays)
        {
            if (NextApprover != null)
            {
                NextApprover.ApplyLeave(requestedDays);
            }
        }

        public override void ApproveLeave(int requestedDays)
        {
            Console.WriteLine(@&quot;Engineer does not have
                       approve permission.&quot;);
        }
    }
    /// &amp;lt;summary&amp;gt;
    /// The &#39;ConcreteHandler&#39; class
    /// &amp;lt;/summary&amp;gt;
    public class ProgramManager:Employee
    {
        public ProgramManager()
        {
            this.onLeaveApplied += ProgramManager_onLeaveApplied;
        }

        private void ProgramManager_onLeaveApplied(int requestedDays)
        {
            ApproveLeave(requestedDays);
            if (NextApprover != null)
                NextApprover.ApplyLeave(requestedDays);
        }

        // If we can process lets show the output
        public override void ApproveLeave(int requestedDays)
        {
            Console.WriteLine(@&quot;EmployeeId: {0} Requested Days: {1} 
                 Approve: {2}&quot;,
                this.EmployeeId, requestedDays, &quot;ProgramManager&quot;);
        }
    }
    /// &amp;lt;summary&amp;gt;
    /// The &#39;ConcreteHandler&#39; class
    /// &amp;lt;/summary&amp;gt;
    public class HR:Employee
    {
        public HR()
        {
            this.onLeaveApplied += HR_onLeaveApplied;
        }

        private void HR_onLeaveApplied(int requestedDays)
        {
            ApproveLeave(requestedDays);
            if (NextApprover != null)
                NextApprover.ApplyLeave(requestedDays);
        }

        // If we can process lets show the output
        public override void ApproveLeave(int requestedDays)
        {
            Console.WriteLine(@&quot;EmployeeId: {0} Requested Days: {1} 
                 Approve: {2}&quot;,
                this.EmployeeId, requestedDays, &quot;HR&quot;);
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            Engineer engineer = new Engineer();
            ProgramManager programManager = new ProgramManager();
            HR hr = new HR();

            //workflow u olusturuyoruz
            engineer.NextApprover = programManager;
            programManager.NextApprover = hr;

            engineer.ApplyLeave(3);

            Console.ReadLine();
        }

    }
&lt;/pre&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggWHT6SGmVns49v3gqB9JzFb64_2FKY3B8da9fBIDhk55bYqHPgFnbFL1KX4v7iXVsW1s9hFI4UkVQ8DGHtbl-35-VNWYO5t10BrYHQ_7MZkUSSW960Y2ymJMDzNce9ClfnH8_e5GHJBo/s1600/chain_cikti.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;110&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggWHT6SGmVns49v3gqB9JzFb64_2FKY3B8da9fBIDhk55bYqHPgFnbFL1KX4v7iXVsW1s9hFI4UkVQ8DGHtbl-35-VNWYO5t10BrYHQ_7MZkUSSW960Y2ymJMDzNce9ClfnH8_e5GHJBo/s640/chain_cikti.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/7948226193419114972/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-chain-of-responsibility-pattern.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/7948226193419114972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/7948226193419114972'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-chain-of-responsibility-pattern.html' title='C# Chain of Responsibility Pattern Kullanımı - OOP Design Pattern'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm9qezHo3u3ME1r2JTo7UdzG0LpEZtYH3Fb1S-okKNBrACFlRXsoJKO5tvXkNK53TUAe08Ib5ipjYY4kzy0eQTU0mnQL841g7a8pJl32RJ3OdpvVUvzdb0NtVw6Yngu2z8cfAyW0cSqKY/s72-c/chain.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-2387766537179457238</id><published>2013-12-06T00:06:00.001+02:00</published><updated>2013-12-08T01:53:52.503+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Design Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Object Oriented Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><category scheme="http://www.blogger.com/atom/ns#" term="Visitor Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Visitor Tasarım Deseni"/><title type='text'>C# Visitor Pattern Kullanımı - OOP Design Pattern</title><content type='html'>Visitor tasarım deseni (ziyaretçi tasarım deseni), behavioral grubuna ait bir tasarım desenidir. Uygulamada ki sınıflara yeni metotlar eklenmesini düzenleyen bir tasarım desenidir. Dofactory.com a göre kullanım sıklığı 20% civarındadır.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU-vluAZgFfHDKbijDSjkaDCSOfREoQDkJYiiqsUTQcNENj5WflHEWiOBcQ6iUKxMxKf4UIQP1L11DSNKKUa5TlSCrkzZVCoSt15-cjSMtaF96S4qwKSL5pVjM6vg8B_ocF4kGObT6M7U/s1600/visitor.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU-vluAZgFfHDKbijDSjkaDCSOfREoQDkJYiiqsUTQcNENj5WflHEWiOBcQ6iUKxMxKf4UIQP1L11DSNKKUa5TlSCrkzZVCoSt15-cjSMtaF96S4qwKSL5pVjM6vg8B_ocF4kGObT6M7U/s400/visitor.gif&quot; width=&quot;350&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Yukarıda belirttiğimiz gibi uygulamaya yetni metotlar eklemesini düzenleyen bir tasarım desenidir &lt;b&gt;Visitor&lt;/b&gt;&amp;nbsp;tasarım deseni. Örneğin uygulamamıza bir metot eklemek istiyoruz bu durumda sınıfların uyguladığı arayüze ve&amp;nbsp;bu arayüzü uygulayan sınıflara metot yazılır veya eklenmesi gereken sınıflara eklenir. Arayüze eklersek bu arayüzü uygulayan tüm sınıflara gerekli olsada olmasada eklemek zorunda kalırız. Bu da tasarım prensiplerine aykırı bir haraket olacaktır. Eklenmesi gereken tüm sınıflara tek tek eklersekte kodun anlaşılırlığı bozulacaktır ayrıca bakımıda zorlaşacaktır; metotta bir değişiklik yapılmak istense tüm sınıflardaki metotlar tek tek update edilmesi gerekecektir. Her yeni ihtiyaç için yeni visitor sınıfları yazıp bunu sınıfımızın kullanmasını sağlayarak bu durumları Visitor tasarım deseni ile ortadan kaldırabiliriz.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Örneğimizide şu şekilde tasarlayalım: Mesela bir tablet sınıfımız var ve bu sınıftan türeyen bazı tabletlerin wifi özelliği var bazılarının yok aynı şekilde bir kısmının 3G özelliği var bir kısmının yok. Böyle olunca tabletlerin türetildiği tablet abstract sınıfına WifiAc(), 3GAc() gibi metot tanımlamamız çok saçma olur. Çünkü Wifi özelliği olmayan bir tablette bu metodu kullanabilir olur böyle olunca. Diğer bir yöntemde wifisi olan sınıfları bulup tek tek wifi açma metodunu eklemek ama buda kodu çok anlaşılmaz hale getirecektir. Aynı zamanda sınıfımıza başka bir özellik eklemek istediğimizde yine sınıfımıza müdahale etmek zorunda kalırız. Bu durumu ortadan kaldırmak için istenilen işleri yapan visitor sınıfları yazıp Accept metodu ile bu sınıfların içerisindeki metodları istediğimiz sınıflar için çalıştırabiliriz. Örnek:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UML Diyagramı:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7ErvVC12ftAUkv0IpLlgxJ7H43lIjHejaA7YqFw7gjd88ooRrKr-_THUvpGcYYYG7wLCbQGHbPcNC8Ul8zb7sTaWXqYmRvWzor1rCajIvo2zFLF-B7r13-Op__ZQmTY94aNfj9wLuKFQ/s1600/visitor_diagram.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;312&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7ErvVC12ftAUkv0IpLlgxJ7H43lIjHejaA7YqFw7gjd88ooRrKr-_THUvpGcYYYG7wLCbQGHbPcNC8Ul8zb7sTaWXqYmRvWzor1rCajIvo2zFLF-B7r13-Op__ZQmTY94aNfj9wLuKFQ/s640/visitor_diagram.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Kod:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre name=&quot;code&quot; class=&quot;csharp&quot;&gt;
    /// &amp;lt;summary&amp;gt;
    /// The &#39;Tablet&#39; abstract class
    /// &amp;lt;/summary&amp;gt;
    public abstract class Tablet
    {
        public string Model { get; set; }
        public string Brand { get; set; }

        public Tablet(string model, string brand)
        {
            Model = model;
            Brand = brand;
        }

        public abstract void Accept(IVisitor visitor);
    }

    /// &amp;lt;summary&amp;gt;
    /// The &#39;ConcreteElement&#39; class
    /// &amp;lt;/summary&amp;gt;
    public class IPad:Tablet
    {
        public IPad(string model, string brand)
            : base(model, brand)
        {
        }

        public override void Accept(IVisitor visitor)
        {
            visitor.Visit(this);
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// The &#39;ConcreteElement&#39; class
    /// &amp;lt;/summary&amp;gt;
    public class GalaxyTab:Tablet
    {
        public GalaxyTab(string model, string brand)
            : base(model, brand)
        {
        }

        public override void Accept(IVisitor visitor)
        {
            visitor.Visit(this);
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// The &#39;Visitor&#39; interface
    /// &amp;lt;/summary&amp;gt;
    public interface IVisitor
    {
        void Visit(Tablet tablet);
    }

    /// &amp;lt;summary&amp;gt;
    /// A &#39;ConcreteVisitor&#39; class
    /// &amp;lt;/summary&amp;gt;
    public class WifiVisitor:IVisitor
    {
        public void Visit(Tablet tablet)
        {
            if (tablet is IPad)
                Console.WriteLine(&amp;quot;Ipad wifi has open.&amp;quot;);
            else if (tablet is GalaxyTab)
                Console.WriteLine(&amp;quot;GalaxyTab does not have wifi option.&amp;quot;);
            else
                Console.WriteLine(&amp;quot;This object is not a tablet.&amp;quot;);
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// A &#39;ConcreteVisitor&#39; class
    /// &amp;lt;/summary&amp;gt;
    public class ThreeGVisitor:IVisitor
    {
        public void Visit(Tablet tablet)
        {
            if (tablet is IPad)
                Console.WriteLine(&amp;quot;Ipad wifi does not have 3G option.&amp;quot;);
            else if (tablet is GalaxyTab)
                Console.WriteLine(&amp;quot;GalaxyTab 3G has open.&amp;quot;);
            else
                Console.WriteLine(&amp;quot;This object is not a tablet.&amp;quot;);
        }
    }

        static void Main(string[] args)
        {
            IPad iPad = new IPad(&amp;quot;Ipad mini&amp;quot;, &amp;quot;Apple&amp;quot;);
            GalaxyTab galaxyTab = new GalaxyTab(&amp;quot;Galaxy Tab&amp;quot;, &amp;quot;Samsung&amp;quot;);

            iPad.Accept(new WifiVisitor());
            galaxyTab.Accept(new WifiVisitor());

            iPad.Accept(new ThreeGVisitor());
            galaxyTab.Accept(new ThreeGVisitor());

        //bunun gibi baska visitor sınıfları yazarak sınıfımızı değiştirmeden
        //yeni metotlar çalıştırabilir hale getirebiliriz. 

            Console.ReadLine();

        }
&lt;/pre&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg05DYXSAoBsBCgUYU0qaCY-YTUiBrFeeydJidxf-muGlSMs8JPNOYnnCwcaSbY7ERwPl1Qsxr1JHJFP8ttm6KAue9QJz6ftgbjbZb3pWuV8qUhX-Wl3x0lugTNc902qCCfUvwCbjDwUIA/s1600/visitor_ss.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg05DYXSAoBsBCgUYU0qaCY-YTUiBrFeeydJidxf-muGlSMs8JPNOYnnCwcaSbY7ERwPl1Qsxr1JHJFP8ttm6KAue9QJz6ftgbjbZb3pWuV8qUhX-Wl3x0lugTNc902qCCfUvwCbjDwUIA/s1600/visitor_ss.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/2387766537179457238/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-visitor-pattern-kullanimi-oop-design.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/2387766537179457238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/2387766537179457238'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/12/c-visitor-pattern-kullanimi-oop-design.html' title='C# Visitor Pattern Kullanımı - OOP Design Pattern'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU-vluAZgFfHDKbijDSjkaDCSOfREoQDkJYiiqsUTQcNENj5WflHEWiOBcQ6iUKxMxKf4UIQP1L11DSNKKUa5TlSCrkzZVCoSt15-cjSMtaF96S4qwKSL5pVjM6vg8B_ocF4kGObT6M7U/s72-c/visitor.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-4807261821517248515</id><published>2013-11-29T15:58:00.000+02:00</published><updated>2013-12-08T02:09:51.358+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Design Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Object Oriented Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><category scheme="http://www.blogger.com/atom/ns#" term="State Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="State Tasarım Deseni"/><title type='text'>C# State Pattern Kullanımı - OOP Design Pattern</title><content type='html'>&lt;div class=&quot;MsoNormal&quot;&gt;
State tasarım deseni behavior grubununa ait, nesnelerin
farklı durumlarda farklı çalışmalarını düzenleyen bir tasarım desenidir.
dofactory.com sitesine göre kullanım sıklığı %60 civarındadır.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivvkyApdI6WEGIi9eTnGlIO53ewm9-Vf52QljeVohoc0kGPwJK0tgtgensyKu-NSIQoOA0tLrOfgGsdd1j7waMbeFBGfFWszZ9yipqlKkM_-CEppuxRr-0gB3J6lCDyO0PkyPB_b8m-qY/s1600/state.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;170&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivvkyApdI6WEGIi9eTnGlIO53ewm9-Vf52QljeVohoc0kGPwJK0tgtgensyKu-NSIQoOA0tLrOfgGsdd1j7waMbeFBGfFWszZ9yipqlKkM_-CEppuxRr-0gB3J6lCDyO0PkyPB_b8m-qY/s400/state.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Örneğin bir kahve makinası düşünün önce duğmesine basarız hazırlanıyor
yazar ekranda bu makinanın hazırlanıyor durumuna geçtiğini gösterir bu durumda
su kaynatılır kahve eklenir. Ardından kahve hazırdır bardağa boşaltma kısmı
gelir. Bu durumda kahve bardağa boşaltılır bitirme durumundadır makina bu
sefer. Görüldüğü gibi makina farklı durumlarda farklı işlemler yapmaktadır. Bu
patternin amacıda bunun gibi nesnenin farklı durumlarında farklı çalışmaların
yapılmasını sağlamaktır.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Bir başka örnek bankacılık sektöründen verilebilir mesela
bir müşterinin hesabındaki parası bir sınırı geçince gold müşteri statüsünde olacaktır
ve verilen faiz oranı değişecektir. Bu durumda da bu pattern kullanılabilir.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Örnek kodumuzu basit bir server otomasyonu yaparak yazmayı
düşündüm. Örnekte contex nesnemiz olarak bir server’ımız var ve CPU değeri %80
in üzerine çıkınca status OverloadState durumuna geliyor ve bu statüde iken
yeniden stabil duruma geçmek için bir takım programları kapatıyor ve yeniden stabil
olunca ise OKState durumuna geçiyor.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;UML Şema:&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEfIOt4hhk94Ti03ZbGEtIfVAVb1wrzLHdaQ9tsY2RxATUX-NF4EVHJ04jnLiKNpkgccTwBqxeb_4JpfVCZdohw0Ys4SQ3-sbmE7nfXMQfr6TX84kOBKBpSu2LjOkwEMaloNvOXpBUmJk/s1600/1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;254&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEfIOt4hhk94Ti03ZbGEtIfVAVb1wrzLHdaQ9tsY2RxATUX-NF4EVHJ04jnLiKNpkgccTwBqxeb_4JpfVCZdohw0Ys4SQ3-sbmE7nfXMQfr6TX84kOBKBpSu2LjOkwEMaloNvOXpBUmJk/s640/1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;Kod:&lt;/b&gt;&lt;/div&gt;
&lt;pre name=&quot;code&quot; class=&quot;csharp&quot;&gt;
     /// &lt;summary&gt;
    /// State abstract class
    /// &lt;/summary&gt;
    public abstract class ServerState
    {
        public abstract void HandleState(Server context);
    }

    /// &lt;summary&gt;
    /// Concrete State
    /// &lt;/summary&gt;
    public class OverloadState:ServerState
    {
        public override void HandleState(Server context)
        {
            Console.WriteLine(@&quot;Server CPULevel is: {0}. Server state 
                 is overload. Some programs is closing.&quot;, context.CPULevel);
            context.CloseProgram(5);
            if (context.CPULevel &gt; 80)
                context.State = new OverloadState();
            else
                context.State = new OkState();
        }
    }

    /// &lt;summary&gt;
    /// Concrete State
    /// &lt;/summary&gt;
    public class OkState:ServerState
    {
        public override void HandleState(Server context)
        {
            Console.WriteLine(@&quot;Server CPULevel is: {0}. Server state 
                   is OK.&quot;
                   ,context.CPULevel);
        }
    }

/// &lt;summary&gt;
    /// Context class
    /// &lt;/summary&gt;
    public class Server
    {
        public int CPULevel { get; set; }

        private ServerState _state;
        public ServerState State
        {
            get { return _state; }
            set
            {
                _state = value;
                // Burada durum değişimleri sonucu çalıştırılacak 
                // davranışların başlatılma noktasınıda 
                // merkezileştirmiş oluyoruz.
                _state.HandleState(this);
            }
        }

        public Server()
        {
            this.CPULevel = 50;
            ControlServerCPULevel();
        }

        public void ControlServerCPULevel()
        {
            if (this.CPULevel &gt; 80)
                this.State = new OverloadState();
            else
                this.State = new OkState();
        }

        public void CloseProgram(int programUsageCPU)
        {
            this.CPULevel -= programUsageCPU;
        }

        public void AddProgram(int programUsageCPU)
        {
            this.CPULevel += programUsageCPU;
            ControlServerCPULevel();
        }
    }

        static void Main(string[] args)
        {
            Server server = new Server();
            server.AddProgram(20);
            server.AddProgram(10);
            server.AddProgram(30);

            Console.ReadLine();

        }
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3y8Szm1E6Sr6T-k_Y26xZQY4u4ogMCMG5CWQnSSEfDVolEh5WVganYC63HoqGk-iMLHFY33oMF00YMHgt-4-mk597pmesxPBVoeKvv7Ds13Hhd-JRMC9Qq1flkU1qyhxC5WPRNO_EqEI/s1600/2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3y8Szm1E6Sr6T-k_Y26xZQY4u4ogMCMG5CWQnSSEfDVolEh5WVganYC63HoqGk-iMLHFY33oMF00YMHgt-4-mk597pmesxPBVoeKvv7Ds13Hhd-JRMC9Qq1flkU1qyhxC5WPRNO_EqEI/s1600/2.png&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/4807261821517248515/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/11/c-state-tasarm-deseni-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/4807261821517248515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/4807261821517248515'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/11/c-state-tasarm-deseni-kullanimi.html' title='C# State Pattern Kullanımı - OOP Design Pattern'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivvkyApdI6WEGIi9eTnGlIO53ewm9-Vf52QljeVohoc0kGPwJK0tgtgensyKu-NSIQoOA0tLrOfgGsdd1j7waMbeFBGfFWszZ9yipqlKkM_-CEppuxRr-0gB3J6lCDyO0PkyPB_b8m-qY/s72-c/state.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-1782010293311257</id><published>2013-11-29T14:52:00.000+02:00</published><updated>2013-12-08T02:19:19.268+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Design Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Mediator Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Mediator Tasarım Deseni"/><category scheme="http://www.blogger.com/atom/ns#" term="Object Oriented Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Mediator Pattern Kullanımı - OOP Design Pattern</title><content type='html'>&lt;div class=&quot;MsoNormal&quot;&gt;
Mediator design pattern (aracı tasarım deseni), behavior
grubununa ait, çalışmaları birbirleri ile aynı arayüzden türeyen nesnelerin
durumlarına bağlı olan nesnelerin davranışlarını düzenleyen tasarım desenidir.
dofactory.com a göre kullanım oranı %40 civarındadır.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9dNRVLpvcRGZiloHkZ_vMMMxEhYmWETrBQpHifumZeeqmRvPkYw57Jw1oUTOlCxLw3tE7Mv-Em5cPuiK-ZMA1tM4ASosWmgaFw0FtNxkW20R58uPUtKmxIU2tf2kHqRJDei74aduOUKo/s1600/mediator.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;165&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9dNRVLpvcRGZiloHkZ_vMMMxEhYmWETrBQpHifumZeeqmRvPkYw57Jw1oUTOlCxLw3tE7Mv-Em5cPuiK-ZMA1tM4ASosWmgaFw0FtNxkW20R58uPUtKmxIU2tf2kHqRJDei74aduOUKo/s320/mediator.gif&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Anlaşılması zor ve karmaşık yapılarda aracı nesne olarak
kullanılır. Bir çok nesne birbirleriyle iletişime geçmek yerine sadece bu aracı
nesne ile bağlanırlar. Buda yapılan tüm karmaşık faaliyetleri gizler ve
kullanıcıların etkileşimleri, sistemi daha rahat anlamasını sağlar.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Kısaca mediator tasarım deseni birbirleri ile ilişkili olan
bu nesneler arasında ki iletişimin ana bir nesne üzerinden (mediator)
yapılmasını sağlar. Böylece nesneler arasındaki bağ zayıflatılır ve geliştirme
aşamasında kod karmaşasını önler ve kodun yönetilmesini kolaylaştırır.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
İnternette dolaşan popular bir örnek var havaalanı ile
ilgili havaalanı olmasa uçaklar ben şimdi iniyorum kimse inmesin gibi
birbirleriyle konuşsalar oluşacak kaosu bir düşünün işte burada havaalanı
mediator tasarım deseninin görevini üstlenerek uçakları tek bir yerden
yönetiyor. Şimdi bu örneği koda dökelim:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;UML Şeması:&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjURokpLHdkPH9UIyk2EKoTUpt2_xaze_NUixzZ5y0d8CD_lgy9YNI8yffVhmRIDojTqWu3SJKd-9Ya9Lq0E3GCvRDPs5lCSGP5cW3YI7xwXY3Y6Y4ggnqDYYSY8mJlnSkcHtHN5N96nU/s1600/1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjURokpLHdkPH9UIyk2EKoTUpt2_xaze_NUixzZ5y0d8CD_lgy9YNI8yffVhmRIDojTqWu3SJKd-9Ya9Lq0E3GCvRDPs5lCSGP5cW3YI7xwXY3Y6Y4ggnqDYYSY8mJlnSkcHtHN5N96nU/s640/1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;Kod:&amp;nbsp;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;/// &amp;lt;summary&amp;gt;
    /// Mediator
    /// &amp;lt;/summary&amp;gt;
    public interface IAirport
    {
        void Register(AirlineBase airline);
        bool GiveLandingPermission(string flightCode);
    }

    /// &amp;lt;summary&amp;gt;
    /// Concrete Mediator
    /// &amp;lt;/summary&amp;gt;
    public class AtaturkAirport:IAirport
    {
        private Dictionary&amp;lt;string, AirlineBase&amp;gt; _planes;

        public AtaturkAirport()
        {
            _planes = new Dictionary&amp;lt;string, AirlineBase&amp;gt;();
        }

        public void Register(AirlineBase airline)
        {
            if (!_planes.ContainsValue(airline))
                _planes.Add(airline.FlightCode, airline);

            airline.Airport = this;
        }

        public bool GiveLandingPermission(string flightCode)
        {
            if (_planes.ContainsKey(flightCode))
                return true;
            else
                return false;
        }
    }
    /// &amp;lt;summary&amp;gt;
    /// Collague
    /// &amp;lt;/summary&amp;gt;
    public abstract class AirlineBase
    {
        public string FlightCode { get; set; }
        public IAirport Airport { get; set; }

        public virtual void GetLandingPermission()
        {
            if (Airport != null)
            {
                bool hasPermissionForLanding = 
                       Airport.GiveLandingPermission(FlightCode);
                if (hasPermissionForLanding)
                    Console.WriteLine(&quot;Inis izni verildi.&quot;);
                else
                    Console.WriteLine(&quot;Inis izni verilmedi!&quot;);
            }
            else
                Console.WriteLine(&quot;Ucak kaydı yapılmamış. İniş   
                        izni yok!&quot;);
        }
    }
    /// &amp;lt;summary&amp;gt;
    /// Concrete Collague
    /// &amp;lt;/summary&amp;gt;
    public class THYAirline: AirlineBase
    {
        public override void GetLandingPermission()
        {
            Console.WriteLine(FlightCode + &quot; nolu THY ucağı   
             inis icin izin gonderdi.&quot;);
            base.GetLandingPermission();
        }
    }
    /// &amp;lt;summary&amp;gt;
    /// Concrete Collague
    /// &amp;lt;/summary&amp;gt;
    public class PegasusAirline:AirlineBase
    {
        public override void GetLandingPermission()
        {
            Console.WriteLine(FlightCode + &quot; nolu Pegasus ucağı   
                  inis icin izin gonderdi.&quot;);
            base.GetLandingPermission();
        }
    }
&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Çıktı:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh50FmWfXULj0nOKYXifnaQzyAHNHr237E1tjZPqPb26iXe4YUtZwr4l3Y_dQOu1YUcwe83VQbPlPF2zpr7FmZQOzpKzVTmH-9Mya9KAHFct7UkVRyI3CdHTjrCEQx7nVFhyIPgYfdyaxI/s1600/2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh50FmWfXULj0nOKYXifnaQzyAHNHr237E1tjZPqPb26iXe4YUtZwr4l3Y_dQOu1YUcwe83VQbPlPF2zpr7FmZQOzpKzVTmH-9Mya9KAHFct7UkVRyI3CdHTjrCEQx7nVFhyIPgYfdyaxI/s1600/2.png&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/1782010293311257/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/11/mediator-design-pattern-kullanimi.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/1782010293311257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/1782010293311257'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/11/mediator-design-pattern-kullanimi.html' title='C# Mediator Pattern Kullanımı - OOP Design Pattern'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9dNRVLpvcRGZiloHkZ_vMMMxEhYmWETrBQpHifumZeeqmRvPkYw57Jw1oUTOlCxLw3tE7Mv-Em5cPuiK-ZMA1tM4ASosWmgaFw0FtNxkW20R58uPUtKmxIU2tf2kHqRJDei74aduOUKo/s72-c/mediator.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5476211391488527281.post-7458273529398885409</id><published>2013-11-29T11:35:00.001+02:00</published><updated>2013-12-08T02:39:39.529+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="C#"/><category scheme="http://www.blogger.com/atom/ns#" term="Design Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Iterator Pattern"/><category scheme="http://www.blogger.com/atom/ns#" term="Iterator Tasarım Deseni"/><category scheme="http://www.blogger.com/atom/ns#" term="Object Oriented Programming"/><category scheme="http://www.blogger.com/atom/ns#" term="Programlama"/><title type='text'>C# Iterator Pattern Kullanımı - OOP Design Pattern</title><content type='html'>&lt;div class=&quot;MsoNormal&quot;&gt;
Iterator (tekrarlayıcı) tasarım deseni, behavior grubununa ait, nesne koleksyonlarının (list,array,queue) elemanlarını belirlenen kurallara göre elde edilmesini düzenleyen tasarım desenidir. dofactory.com a göre hemen hemen bütün uygulamalarda kullanılmaktadır.&lt;br /&gt;
&lt;br /&gt;
Iterator (tekrarlayıcı) tasarım deseni, behavior grubununa
ait, nesne koleksyonlarının (list,array,queue) elemanlarını belirlenen
kurallara göre elde edilmesini düzenleyen tasarım desenidir. dofactory.com a
göre hemen hemen bütün uygulamalarda kullanılmaktadır.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhj7IR6I_nLFmMchKS4dhwLPQ2o-zSbqN1C9H3ICY1ZUO3ZT5l0B-5Uczv8PflSUf7gug6OTEkKIcDYjRD3BsflJL9FB5iM6PgnLFXGlbmWHetxK0oKCSW2RjMD8yDpNrwhfPK1RrQXpU/s1600/iterator.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;296&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhj7IR6I_nLFmMchKS4dhwLPQ2o-zSbqN1C9H3ICY1ZUO3ZT5l0B-5Uczv8PflSUf7gug6OTEkKIcDYjRD3BsflJL9FB5iM6PgnLFXGlbmWHetxK0oKCSW2RjMD8yDpNrwhfPK1RrQXpU/s400/iterator.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Koleksiyonlar nesne tabanlı dillerde sıkça kullandığımız
yapıların başında geliyor. Iterator tasarım deseni koleksiyonunun array, queue,
list olduğunun bilinmesine ihtiyaç duyumadan koleksiyon elemanları üzerinde
işlem yapılabilmesini sağlar. Koleksiyon içerisindeki nesneleri örneğin foreach
ile dönersek sırasıyla işleriz fakat öyle bir ihtiyacımız var ki nesneleri 3’er
3’er dönmemiz gerekiyor. Bunu iterator tasarım kalıbıyla gerçekleştirebiliriz.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Aynı zamanda kendi itaratorlerimizi yazabiliriz bu kalıpla.
Örneğin bir tarih aralığı verildi bize biz bu tarih aralığındaki çalışma
günlerini bulucaz. Bunu mesela for veya foreach ile yapamayız ama iterator
tasarım kalıbını kullanarak günler üzerinde gezebiliriz.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;Aggregate&lt;/b&gt;
sınıfları koleksiyon barındıran ve bu koleksiyon ile iterator sınıfını
oluşturan sınıflardı. &lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;Iterator&lt;/b&gt;
sınıfları ise ileri geri gitme gibi işlemlerin yapıldığı sınıflardır.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Bu örneği şimdi koda dökelim:&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;UML Şeması:&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIigIHWXQva2RVmCvTpWq2B2yBGqkSrTgHXgdN5oLcjYjjYM0EecoIR79KEaSq1YD6o5fp4NOvDCjhxB-OWXZS6buC4ta9M5kLhY9FKky9Mu3o8bMi3NooI4HGuYaXgoePuyduv4aJxh0/s1600/1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;474&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIigIHWXQva2RVmCvTpWq2B2yBGqkSrTgHXgdN5oLcjYjjYM0EecoIR79KEaSq1YD6o5fp4NOvDCjhxB-OWXZS6buC4ta9M5kLhY9FKky9Mu3o8bMi3NooI4HGuYaXgoePuyduv4aJxh0/s640/1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b&gt;Kod: &lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;
&lt;pre class=&quot;csharp&quot; name=&quot;code&quot;&gt;    /// &amp;lt;summary&amp;gt;
    /// Iterator Interface
    /// &amp;lt;/summary&amp;gt;
    public interface IAbstractIterator
    {
        bool Next();
    }
/// &amp;lt;summary&amp;gt;
    /// Haftasonlarını itere edicek şekilde tasarlanmış iterator sınıfımız
    /// &amp;lt;/summary&amp;gt;
    public class FreeWeekDayIterator: IAbstractIterator
    {
        protected DateTimeAggregate DateRange;
        protected DateTime Cursor;

        public FreeWeekDayIterator(DateTimeAggregate dateRange)
        {
            DateRange = dateRange;
            Cursor = DateRange.DateBegin;
        }

        public bool Next()
        {
            if (Cursor.DayOfWeek == DayOfWeek.Saturday 
                          || Cursor.DayOfWeek == DayOfWeek.Sunday)
            {
                int daysToAdd = 
                   Cursor.DayOfWeek == DayOfWeek.Saturday ? 1 : 6;
                Cursor = Cursor.AddDays(daysToAdd);
                if (Cursor &amp;lt; DateRange.DateEnd)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                int dayid = (int)Cursor.DayOfWeek;
                int daysToWeekend = 6 - dayid;
                Cursor = Cursor.AddDays(daysToWeekend);
                return true;
            }
        }

        public DateTime Current
        {
            get { return Cursor; }
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// Iterator yaratacak olan Aggregate interface
    /// &amp;lt;/summary&amp;gt;
    public interface IDateTimeAggregate
    {
        FreeWeekDayIterator CreateIterator
                   (DateTime dateBegin, DateTime dateEnd);
    }

    /// &amp;lt;summary&amp;gt;
    /// Koleksiyon barındıran ve bu koleksiyon ile iterator 
    /// sınıfını oluşturan Aggregate sınıfı
    /// &amp;lt;/summary&amp;gt;
    public class DateTimeAggregate : IDateTimeAggregate
    {
        public DateTime DateBegin;
        public DateTime DateEnd;

        public FreeWeekDayIterator CreateIterator
                (DateTime dateBegin, DateTime dateEnd)
        {
            DateBegin = dateBegin;
            DateEnd = dateEnd;

            return new FreeWeekDayIterator(this);
        }
    }
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;b style=&quot;mso-bidi-font-weight: normal;&quot;&gt;Çıktı:&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv8UQTWam5gd5T2YhhVDToOvZ2ZjKMcKHZOoS61249CiDUcZkYEfZ3eNA0EGXmI07kbWulOWJ8wgbR7jUFuwpvRmI7IUCHCqM0XDMESzHyyjP6oVa79AabTxX_B5-L0U2j_tU78mfSoKY/s1600/2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv8UQTWam5gd5T2YhhVDToOvZ2ZjKMcKHZOoS61249CiDUcZkYEfZ3eNA0EGXmI07kbWulOWJ8wgbR7jUFuwpvRmI7IUCHCqM0XDMESzHyyjP6oVa79AabTxX_B5-L0U2j_tU78mfSoKY/s1600/2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://safakunel.blogspot.com/feeds/7458273529398885409/comments/default' title='Kayıt Yorumları'/><link rel='replies' type='text/html' href='http://safakunel.blogspot.com/2013/11/c-iterator-pattern-kullanimi-oop.html#comment-form' title='0 Yorum'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/7458273529398885409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5476211391488527281/posts/default/7458273529398885409'/><link rel='alternate' type='text/html' href='http://safakunel.blogspot.com/2013/11/c-iterator-pattern-kullanimi-oop.html' title='C# Iterator Pattern Kullanımı - OOP Design Pattern'/><author><name>Safak Unel</name><uri>http://www.blogger.com/profile/06099706901461930010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhj7IR6I_nLFmMchKS4dhwLPQ2o-zSbqN1C9H3ICY1ZUO3ZT5l0B-5Uczv8PflSUf7gug6OTEkKIcDYjRD3BsflJL9FB5iM6PgnLFXGlbmWHetxK0oKCSW2RjMD8yDpNrwhfPK1RrQXpU/s72-c/iterator.gif" height="72" width="72"/><thr:total>0</thr:total></entry></feed>