<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>C# &#8211; Kemal Burak Yılmaz</title>
	<atom:link href="http://www.kemalburakyilmaz.com/category/c-sharp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kemalburakyilmaz.com</link>
	<description>Unutma Unutturma</description>
	<lastBuildDate>
	Mon, 04 Jan 2021 11:10:36 +0000	</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.1.8</generator>
	<item>
		<title>Singleton Design Pattern Nedir?</title>
		<link>http://www.kemalburakyilmaz.com/singleton-design-pattern-nedir/</link>
				<pubDate>Thu, 18 Apr 2019 11:27:31 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=641</guid>
				<description><![CDATA[Hepimizin bildiği gibi kod yazarken tanımladığımız değişkenler, oluşturduğumuz nesneler bellekte bir yer tutar. İyi bir yazılımcı kod yazarken bu bellek yönetimini de düşünmelidir. Kodumuzu yazarken; gelen her bir istek için, yeni bir nesne oluşturmanın performans kaybına neden olacağı  bir durumu farkettik. İşte bu gibi durumlarda imdadımıza Singleton Design Pattern&#8216;ı yetişiyor. Singleton, bir sınıfın tek bir [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>Hepimizin bildiği gibi kod yazarken tanımladığımız değişkenler, oluşturduğumuz nesneler bellekte bir yer tutar. İyi bir yazılımcı kod yazarken bu bellek yönetimini de düşünmelidir. Kodumuzu yazarken; gelen her bir istek için, yeni bir nesne oluşturmanın performans kaybına neden olacağı  bir durumu farkettik. İşte bu gibi durumlarda imdadımıza <em><strong>Singleton Design Pattern</strong></em>&#8216;ı yetişiyor.</p>
<p>Singleton, bir sınıfın tek bir instance&#8217;ını almak için kullanılır. Yani bir sınıfı bir kere create ettikten sonra, nereden ulaşırsak ulaşalım bize aynı örneği dönecektir. Mesela bir Asp.Net projesinde <strong>singleton</strong> tasarım kalıbı kullanarak oluşturduğumuz bir nesne, IIS resetlenmediği sürece  hep aynı instance üzerinden çalışacaktır.<strong> Sistem ayakta olduğu sürece yeni bir örnek kesinlikle oluşturulmaz.</strong></p>
<p>Basit anlamda bir Singleton nesnesi aşağıdaki gibi oluşturulur:</p>
<pre class="brush: csharp; title: ; notranslate">
    class ConnectionManager
    {
        private static ConnectionManager Instance;
        private ConnectionManager()
        {
             
        }

        public static ConnectionManager ActiveInstance
        {
            get
            {
                if (Instance == null)
                {
                    Instance = new ConnectionManager();
                    return Instance;
                }

                return Instance;
            }
        }

    }
</pre>
<p>Bir  web projesinde; aynı anda birden fazla thread singleton nesneye erişmeye çalıştığında, bir işlem bitmeden diğeri için örnekleme yapar. Bunu engellemek için <strong>Kilitleme</strong> yapacağız. Böylelikle uygulamamız thread-safe olacaktır . Lock işlemini de şu şekilde yazabiliriz.</p>
<pre class="brush: csharp; title: ; notranslate">
    class ConnectionManager
    {
        private static ConnectionManager Instance;
        private static object _lockObject = new object();
        private ConnectionManager()
        {
             
        }

        public static ConnectionManager ActiveInstance
        {
            get
            {
                //Eğer instance null değil ise thread-safe gözetmeksizin döndürülür.
                if (Instance == null)
                {
                    //Eğer null ise nesneyi diğer threadlerin erişimine kapatıyoruz.
                    lock (_lockObject)
                    {
                        if (Instance == null)
                        {
                            Instance = new ConnectionManager();
                        }
                    }
                }

                return Instance;
            }
        }

    }
</pre>
<p>* Hatırlanması Gereken Noktalar :</p>
<ul>
<li>Tüm istemcilerin aynı instance&#8217;dan işlem yapmak istediği durumlarda kullanılmalıdır. Bir nesneyi tekrar tekrar oluşturmayı engeller.</li>
<li>Tasarım kalıbı kullanılmadan önce ihtiyaç iyice gözden geçirilmelidir.</li>
</ul>
]]></content:encoded>
										</item>
		<item>
		<title>.Net Core DI ve Autofac DI Container Lifetime Karşılaştırılması</title>
		<link>http://www.kemalburakyilmaz.com/net-core-di-ve-autofac-di-container-lifetime-karsilastirilmasi/</link>
				<pubDate>Tue, 09 Apr 2019 12:05:24 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[.Net Core]]></category>
		<category><![CDATA[Asp.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[.net core]]></category>
		<category><![CDATA[autofac]]></category>
		<category><![CDATA[dependency injection]]></category>
		<category><![CDATA[di]]></category>
		<category><![CDATA[microsoft]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=622</guid>
				<description><![CDATA[.Net Core kullanmaya başlamadan önce Dependency Injection(DI) için Autofac kütüphanelerini kullanıyordum. Açıkcası çok da seviyordum. Daha sonra projemizi Core&#8216;a taşıyalım deyince, kullandığımız kütüphaneler için alternatif neler varmış diye araştırmaya başladık. Önce benchmarkları inceledik. Aşağıdaki adresten sizler de inceleyebilirsiniz: https://github.com/danielpalme/IocPerformance Benchmarka verilerine göre LightInject kullanmaya karar verdik. Gerekli implementasyonları yaparken zorlandık. Autofac gibi kolay ve anlaşılır [&#8230;]]]></description>
								<content:encoded><![CDATA[<p><strong>.Net Core</strong> kullanmaya başlamadan önce <em>Dependency Injection(DI)</em> için <em>Autofac</em> kütüphanelerini kullanıyordum. Açıkcası çok da seviyordum. Daha sonra projemizi <strong>Core</strong>&#8216;a taşıyalım deyince, kullandığımız kütüphaneler için alternatif neler varmış diye araştırmaya başladık. Önce benchmarkları inceledik. Aşağıdaki adresten sizler de inceleyebilirsiniz:</p>
<p><a href="https://github.com/danielpalme/IocPerformance">https://github.com/danielpalme/IocPerformance</a></p>
<p>Benchmarka verilerine göre <a href="https://www.lightinject.net/">LightInject</a> kullanmaya karar verdik. Gerekli implementasyonları yaparken zorlandık. <em>Autofac</em> gibi kolay ve anlaşılır değildi, ayrıca community&#8217;si de çok güçlü olmadığından sorularımıza cevap bulamadık. Durum böyle bir hal alınca dedik ki neden <em>Microsoft DI</em> kullanmıyoruz. Hem hızlı hem de community desteği var. <em>Autofac</em>&#8216;den <em>Microsoft DI</em>&#8216;a geçiş yaparken Lifetime tanımlamalarında acaba hangisi hangisidir? Şu neye karşılık gelir dediğimiz yerler oldu. O kısımları da aşağıda sizlerle paylaşıyorum.</p>

<table id="tablepress-1" class="tablepress tablepress-id-1">
<thead>
<tr class="row-1 odd">
	<th class="column-1">Autofac</th><th class="column-2">.Net Core</th><th class="column-3">Açıklama</th>
</tr>
</thead>
<tbody class="row-hover">
<tr class="row-2 even">
	<td class="column-1">InstancePerDependency()</td><td class="column-2">ServiceLifetime.Transient<br />
<br />
services.AddTransient<,></td><td class="column-3">Her nesne isteğinde, yeni bir instance döner</td>
</tr>
<tr class="row-3 odd">
	<td class="column-1">InstancePerLifetimeScope()<br />
<br />
InstancePerRequest()</td><td class="column-2">ServiceLifetime.Scoped<br />
<br />
services.AddScope<,></td><td class="column-3">Her scope için tek bir instance yaratır. Mesela bir web projesinde http request bir scope'tur. Sonlanana kadar hep aynı instance'ı döner.</td>
</tr>
<tr class="row-4 even">
	<td class="column-1">SingleInstance()</td><td class="column-2">ServiceLifetime.Singleton<br />
<br />
services.AddSingleton<,></td><td class="column-3">Uygulama ayağa kalktığında tek bir instance yaratılır ve hep bu instance geri döner.</td>
</tr>
</tbody>
</table>
<!-- #tablepress-1 from cache -->
]]></content:encoded>
										</item>
		<item>
		<title>Abstract Sınıf ve Interface Arasındaki Farklar</title>
		<link>http://www.kemalburakyilmaz.com/abstract-sinif-ve-interface-arasindaki-farklar/</link>
				<pubDate>Thu, 28 Mar 2019 13:12:39 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=550</guid>
				<description><![CDATA[Interface de abstract sınıflar da soyutlama için kullanılır. Aşağıda her ikisi için de detaylı yazılarımızı yazmıştık. http://www.kemalburakyilmaz.com/interface-nedir/ http://www.kemalburakyilmaz.com/abstract-nedir/ Bu yazımızda aralarındaki farkları kısaca listeleyeceğiz. İş görüşmelerinde sorulan klasik sorulardandır 🙂 Bir abstract sınıf soyut olan veya olmayan memberlara sahip olabilir. Fakat bir interface&#8217;deki tüm memberler soyutdur ve türetilmiş sınıflarda override edilmek zorundadır. Bir sınıf birden [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>Interface de abstract sınıflar da soyutlama için kullanılır. Aşağıda her ikisi için de detaylı yazılarımızı yazmıştık.</p>
<p><a href="http://www.kemalburakyilmaz.com/interface-nedir/">http://www.kemalburakyilmaz.com/interface-nedir/</a></p>
<p><a href="http://www.kemalburakyilmaz.com/abstract-nedir/">http://www.kemalburakyilmaz.com/abstract-nedir/</a></p>
<p>Bu yazımızda aralarındaki farkları kısaca listeleyeceğiz. İş görüşmelerinde sorulan klasik sorulardandır <img src="https://s.w.org/images/core/emoji/11.2.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<ol>
<li>Bir abstract sınıf soyut olan veya olmayan memberlara sahip olabilir. Fakat bir interface&#8217;deki tüm memberler soyutdur ve türetilmiş sınıflarda override edilmek zorundadır.</li>
<li>Bir sınıf birden fazla interface&#8217;den türetilebilirken, yalnızca bir abstract class&#8217;dan türetilebilir.</li>
<li>Abstract sınıflar içerisi dolu veya boş metod ve değişkenler bulundurabilir fakat interface&#8217;ler yalnızca içerisi boş metodlar bulundurabilir.</li>
<li>Interface&#8217;ler access modifiers içeremez fakat abstract sınıflar bunları metodlar ve değişkenler için kullanabilir.</li>
</ol>
]]></content:encoded>
										</item>
		<item>
		<title>Rest ve Soap Servisler Nelerdir?</title>
		<link>http://www.kemalburakyilmaz.com/rest-ve-soap-servisler-nelerdir/</link>
				<pubDate>Sat, 08 Apr 2017 16:04:15 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=613</guid>
				<description><![CDATA[Web servisler; sunucular üzerinde çalıştırılan, başka uygulamalar tarafından çağrılan metodları barındıran, genellikle gelen isteği karşılayıp sonuç döndüren yapılardır. SOAP(Simple Object Access Protocol), XML tabanlı mesajlaşma protokolüdür. Bir SOAP servisin içeriği hakkındaki bilgiler WSDL dosyası içerisinden okunabilir. Bu WSDL dökümanı kullanılarak servis generate edilebilir. SOAP mesaj yapıları 4 elementten oluşmaktadır. Envelope: Servisin istek ve cevap bilgilerini [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>Web servisler; sunucular üzerinde çalıştırılan, başka uygulamalar tarafından çağrılan metodları barındıran, genellikle gelen isteği karşılayıp sonuç döndüren yapılardır.</p>
<p><strong>SOAP(Simple Object Access Protocol)</strong>, XML tabanlı mesajlaşma protokolüdür. Bir SOAP servisin içeriği hakkındaki bilgiler WSDL dosyası içerisinden okunabilir. Bu WSDL dökümanı kullanılarak servis generate edilebilir. SOAP mesaj yapıları 4 elementten oluşmaktadır.</p>
<ol>
<li>Envelope: Servisin istek ve cevap bilgilerini içerir.</li>
<li>Header: Her zaman olmayabilir. Metadata bilgilerini iletir.</li>
<li>Body: Yapılan isteğin adı ve parametleri, sunucudan gelen cevap bu kısımda tutulut. Her zaman olmak zorundadır.</li>
<li>Hatayı ve durumunu içerir.</li>
</ol>
<p>Örnek bir SOAP mesaj yapısı:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;soap:Envelope
xmlns:soap=&quot;http://www.w3.org/2003/05/soap-envelope/&quot;
soap:encodingStyle=&quot;http://www.w3.org/2003/05/soap-encoding&quot;&gt;
	&lt;soap:Header&gt;
		...
	&lt;/soap:Header&gt;
	&lt;soap:Body&gt;
		...
		
		&lt;soap:Fault&gt;
			...
		&lt;/soap:Fault&gt;
	&lt;/soap:Body&gt;
&lt;/soap:Envelope&gt;
</pre>
<p><strong>REST(Representational State Transfer), </strong>Http protokolünü kullanan, istemci-sunucu arasındaki hızlı veri akışını sağlayan yöntemdir. SOAP mimarisine göre daha esnek ve minimum içerikle veri akışını sağladığı için daha hızlıdır. Json,xml hatta text formatında veri aktarımını yapabilir. Restful servislerde genelde aşağıdaki HHTP metodları kullanılır:</p>
<ul>
<li>POST = Insert</li>
<li>GET = Select</li>
<li>PUT, PATCH = Update</li>
<li>DELETE = Delete</li>
</ul>
<p>* Hatırlanması Gereken Noktalar :</p>
<ul>
<li>Soap yalnızca xml tabanlıdır. Rest json,xml,text olarak çalışabilir.</li>
<li>Rest için WSDL tanımlanma zorunluluğu yokken Soap&#8217;da vardır.</li>
<li>Rest için HTTP zorunluluğu varken Soap, Tcp Smtp protokollerinde de çalışabilir.</li>
<li>Rest, HTTP hatası döndüğü için hata ayıklamak daha kolaydır.</li>
<li>Soap güvenlik açısından daha geliştirmiştir çünkü hazır yapıları vardır.</li>
<li>Rest servis entegrasyonu çok daha kolaydır.</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
										</item>
		<item>
		<title>C# Virtual Method Nedir?</title>
		<link>http://www.kemalburakyilmaz.com/c-virtual-method-nedir/</link>
				<pubDate>Sat, 08 Apr 2017 08:59:47 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=605</guid>
				<description><![CDATA[C# Virtaul Metod&#8217;lar, türetildiği sınıfta yeniden tanımlanabilen metodlardır. Base sınıftaki bir metodu neden virtual olarak tanımlarız? Bir çok türetilmiş sınıfta base sınıftaki haliyle kullanılacak ama bazı sınıflarda farklı şekilde de kullanılabilir dediğimizde; yapacağımız hareket metodu virtual olarak tanımlamaktır. Abstract metod; temelde diyoruz ki herhangi bir alt sınıfta override edilmek zorunda ve kendi versiyonu yazılmalıdır. Virtual [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>C# Virtaul Metod&#8217;lar, türetildiği sınıfta yeniden tanımlanabilen metodlardır. Base sınıftaki bir metodu neden virtual olarak tanımlarız? Bir çok türetilmiş sınıfta base sınıftaki haliyle kullanılacak ama bazı sınıflarda farklı şekilde de kullanılabilir dediğimizde; yapacağımız hareket metodu virtual olarak tanımlamaktır.</p>
<ul>
<li>Abstract metod; temelde diyoruz ki herhangi bir alt sınıfta override edilmek zorunda ve kendi versiyonu yazılmalıdır.</li>
<li>Virtual metod; diyoruz ki base sınıftaki metod senin işini görüyorsa hiç dokunma eğer yeterli değilse geçersiz kıl ve kendine göre yaz.</li>
</ul>
<p>Yukarıda ne demek istedik bir örnekle pekiştirelim:</p>
<pre class="brush: csharp; title: ; notranslate">

    public class Vehicle
    {
        public virtual void GetSpeedAverage()
        {
            Console.WriteLine(&quot;Ortalama Hız - Base Class&quot;);
        }
    }
</pre>
<p>Yukarıda base sınıf olarak kullanacağımız yerde diyoruz ki; GetSpeedAverage metodu ekrana &#8220;Ortalama Hız &#8211; Base Class&#8221; yazısını yazar. Aracın ortalama hızını bilmiyorsanız boş geçebilirsiniz. He yok aracın ortalama hızını biliyorsanız override ederek ekrana yazdırabilirsiniz.</p>
<pre class="brush: csharp; title: ; notranslate">

    public class Mercedes : Vehicle
    {
        public override void GetSpeedAverage()
        {
            Console.WriteLine(&quot;150&quot;);
        }
    }
</pre>
<pre class="brush: csharp; title: ; notranslate">
    public class Bmw : Vehicle
    {

    }
</pre>
<p>Yukarıdaki şekilde de alt sınıfları tanımladıktan sonra Main metodu içerisinde aşağıdaki şekilde işlemlemleri yapıyoruz.</p>
<pre class="brush: csharp; title: ; notranslate">
        static void Main(string[] args)
        {
            Vehicle a = new Vehicle();
            a.GetSpeedAverage();

            Vehicle mercedes = new Mercedes();
            mercedes.GetSpeedAverage();
            
            Vehicle bmw = new Vehicle();
            bmw.GetSpeedAverage();
        }
</pre>
<p>Çalıştırdığımızda programın çıktısı, sizin de tahmin edeceğiniz üzere:</p>
<p><img class="alignnone size-medium wp-image-608" src="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/04/2019-04-08-11_57_31-C__Projects_OopExamples_OopExamples_bin_Debug_OopExamples.exe_-300x120.png" alt="" width="300" height="120" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/04/2019-04-08-11_57_31-C__Projects_OopExamples_OopExamples_bin_Debug_OopExamples.exe_-300x120.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/04/2019-04-08-11_57_31-C__Projects_OopExamples_OopExamples_bin_Debug_OopExamples.exe_.png 574w" sizes="(max-width: 300px) 100vw, 300px" /></p>
]]></content:encoded>
										</item>
		<item>
		<title>Partial Class Nedir?</title>
		<link>http://www.kemalburakyilmaz.com/partial-class-nedir/</link>
				<pubDate>Wed, 29 Mar 2017 13:13:55 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=563</guid>
				<description><![CDATA[Partial anahtar sözcüğü bir sınıfı birden fazla sınıfa ayırmamızı sağlar. Yani çok uzun olduğunu düşündüğümüz bir sınıfı partial keywordu sayesinde ayrı ayrı .cs dosyalarında bile tutabiliriz. İki ayrı fiziksel dosyada olmalarına rağmen tek sınıf gibi çalışacaklardır. Bir örnekle pekiştirelim. Person sınıfını iki ayrı partial sınıf olarak yazdık. &#8220;SurName&#8221; değişkenini private(Partial olmasa erişemezdi.) olarak tanımladım ve [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>Partial anahtar sözcüğü bir sınıfı birden fazla sınıfa ayırmamızı sağlar. Yani çok uzun olduğunu düşündüğümüz bir sınıfı partial keywordu sayesinde ayrı ayrı .cs dosyalarında bile tutabiliriz. İki ayrı fiziksel dosyada olmalarına rağmen tek sınıf gibi çalışacaklardır. Bir örnekle pekiştirelim.</p>
<pre class="brush: csharp; title: ; notranslate">
    public partial class Person
    {
        private string SurName { get; set; }
        public string Name { get; set; }
    }

    public partial class Person
    {
        public void SetSurName()
        {
            this.SurName = &quot;Text&quot;;
        }
    }
</pre>
<p>Person sınıfını iki ayrı partial sınıf olarak yazdık. &#8220;SurName&#8221; değişkenini private(Partial olmasa erişemezdi.) olarak tanımladım ve diğer partial sınıfta o değişkeni doldurduk. Person tipinde bir nesne oluşturduğumuzda tek bir sınıf gibi çalıştıklarını göreceğiz.</p>
<p><img class=" wp-image-564 aligncenter" src="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/03/2019-03-29-16_01_15-OopExamples-Microsoft-Visual-Studio-300x126.png" alt="" width="474" height="199" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/03/2019-03-29-16_01_15-OopExamples-Microsoft-Visual-Studio-300x126.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/03/2019-03-29-16_01_15-OopExamples-Microsoft-Visual-Studio.png 763w" sizes="(max-width: 474px) 100vw, 474px" /></p>
<p>&nbsp;</p>
<p>* Hatırlanması Gereken Noktalar :</p>
<ul>
<li>Tüm partial sınıflar için &#8220;partial&#8221; anahtar sözcüğünü kullanmak zorundayız.</li>
<li>Dosya adları farklı olsa da tüm partial sınıfların isimleri aynı olmalı.</li>
<li>Tüm partial sınıflar aynı namespace&#8217;de olmalıdır.</li>
<li>Tüm sınıflar aynı erişebilirlik seviyesine sahiptir.</li>
<li>Herhangi bir partial sınıf, bir interface&#8217;den inherit edilirse tüm partial sınıflar da inherit edilmiş olur.</li>
<li>Herhangi bir partial sınıf abstract olarak işaretlenirse tüm partial sınıflar da abstract olur.</li>
</ul>
]]></content:encoded>
										</item>
		<item>
		<title>Polymorphism Nedir?</title>
		<link>http://www.kemalburakyilmaz.com/polymorphism-nedir/</link>
				<pubDate>Wed, 29 Mar 2017 08:58:55 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=559</guid>
				<description><![CDATA[Polymorphism(Çok Biçimlilik) bir ismin bir çok biçime sahip olabileceği OOP kavramıdır. Sanırım ne demek istediğimi örneklerle daha iyi anlatabileceğim 🙂 Mesela akıllı bir telefonumuz var. Bu telefonda iletişim kurmak için birden fazla yöntemi var değil mi? Arama yapabiliriz, mesaj atabiliriz, mail atabiliriz vs. Burada her birinde ortak olan şey iletişim kurmaktır fakat her birinin yaklaşımı [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>Polymorphism(Çok Biçimlilik) bir ismin bir çok biçime sahip olabileceği OOP kavramıdır. Sanırım ne demek istediğimi örneklerle daha iyi anlatabileceğim <img src="https://s.w.org/images/core/emoji/11.2.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Mesela akıllı bir telefonumuz var. Bu telefonda iletişim kurmak için birden fazla yöntemi var değil mi? Arama yapabiliriz, mesaj atabiliriz, mail atabiliriz vs. Burada her birinde ortak olan şey iletişim kurmaktır fakat her birinin yaklaşımı farklıdır. İşte bu çok biçimliliktir(Polymorphism). Aşağıdaki sınıfı incelediğinizde Communicate metodunun iki sınıfta da farklı yaklaşımlarla aynı görevi yaptığını göreceksiniz.</p>
<pre class="brush: csharp; title: ; notranslate">
    public abstract class Communication
    {
        public virtual void Communicate(string text)
        {
            Console.WriteLine(&quot;Default mesaj&quot;);
        }
    }

    public class Message : Communication
    {
        public override void Communicate(string text)
        {
            Console.WriteLine(text);
        }
    }

    public class Mail : Communication
    {

    }
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
										</item>
		<item>
		<title>Sealed Class Nedir?</title>
		<link>http://www.kemalburakyilmaz.com/sealed-class-nedir/</link>
				<pubDate>Wed, 29 Mar 2017 08:09:26 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=554</guid>
				<description><![CDATA[Daha önce hiç kullanmadığım, bir mülakatta sorulduğunda bilemediğim Sealed Class nedir? Sealed kelime anlamı olarak mühürlü, kapalı anlamına gelmektedir. Sealed anahtar sözcüğü, kullanıldığı sınıftan başka bir sınıf türetilmesini engellemek için kullanılır. Yani bu sınıftan diğer sınıflara kalıtım verilemez. Bu işlem güvenlik önlemi almak için yapılır. &#160; * Hatırlanması Gereken Noktalar : Kendisinden başka bir sınıf [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>Daha önce hiç kullanmadığım, bir mülakatta sorulduğunda bilemediğim Sealed Class nedir? Sealed kelime anlamı olarak mühürlü, kapalı anlamına gelmektedir. Sealed anahtar sözcüğü, kullanıldığı sınıftan başka bir sınıf türetilmesini engellemek için kullanılır. Yani bu sınıftan diğer sınıflara kalıtım verilemez. Bu işlem güvenlik önlemi almak için yapılır.</p>
<p><img class="wp-image-555 aligncenter" src="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/03/2019-03-28-18_17_12-OopExamples-Microsoft-Visual-Studio-300x105.png" alt="" width="449" height="157" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/03/2019-03-28-18_17_12-OopExamples-Microsoft-Visual-Studio-300x105.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/03/2019-03-28-18_17_12-OopExamples-Microsoft-Visual-Studio-768x270.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/03/2019-03-28-18_17_12-OopExamples-Microsoft-Visual-Studio.png 783w" sizes="(max-width: 449px) 100vw, 449px" /></p>
<p>&nbsp;</p>
<p>* Hatırlanması Gereken Noktalar :</p>
<ul>
<li>Kendisinden başka bir sınıf türetilmesi engellenen sınıflardır.</li>
<li>Hiyerarşideki son sınıftır.</li>
<li>Sealed sınıflar başka bir sınıftan türetilmiş olabilir fakat base class olamaz.</li>
<li>Bir sınıf hem sealed hem abstract sınıf olamaz.</li>
</ul>
]]></content:encoded>
										</item>
		<item>
		<title>Abstract Class Nedir?</title>
		<link>http://www.kemalburakyilmaz.com/abstract-nedir/</link>
				<pubDate>Tue, 28 Mar 2017 12:12:16 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=56</guid>
				<description><![CDATA[Bu yazımızda abstract class nedir? abstract method nedir? sorularının cevaplarını arayacağız. Abstraction kelime anlamı olarak soyutlama anlamına gelir. Abstract class; birden fazla ortak özelliği ve işlevi olan sınıfların, ortak oldukları yerleri tek bir yerde toplayan ve bu sınıflara base class olma özelliğini üstlenen sınıflardır. Abstract sınıflardan yeni bir nesne oluşturulamaz. Sadece diğer sınıflara base class [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>Bu yazımızda abstract class nedir? abstract method nedir? sorularının cevaplarını arayacağız. Abstraction kelime anlamı olarak soyutlama anlamına gelir.</p>
<p><strong>Abstract class</strong>; birden fazla ortak özelliği ve işlevi olan sınıfların, ortak oldukları yerleri tek bir yerde toplayan ve bu sınıflara base class olma özelliğini üstlenen sınıflardır.</p>
<ul>
<li>Abstract sınıflardan yeni bir nesne oluşturulamaz. Sadece diğer sınıflara base class olmak için yazılır.</li>
</ul>
<p><img class="alignnone wp-image-60 size-full" src="http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract3.png" alt="" width="708" height="131" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract3.png 708w, http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract3-300x56.png 300w" sizes="(max-width: 708px) 100vw, 708px" /></p>
<p><strong>Abstract method</strong>; gövdesi bulunmayan, abstract class içerisinde tanımlanan ve türetilen sınıflarda override edilen metodlardır.</p>
<p>Şimdi yazılım dünyasından bir örnekle konuyu daha iyi anlamaya çalışalım. Bir çoğumuz projelerimizde loglama işlemi yapıyoruz. Bazı logları veritabanına bazı logları text dosyasına yazıyoruz. Loglarımızı yazmadan önce gelen hata kodunun açıklamasını okuyoruz ve ardından bu açıklamaları bir yere logluyoruz.<br />
Baktığımız zaman iki loggerda da aynı işlemleri yapacağız. Metod olarak yazarsak GetHataAciklama ve Write metodlarımız var. Peki GetHataAciklama iki sınıfta da aynı şekilde çalışmayacak mı? Hee o zaman bunu abstract sınıfa yazabiliriz. Peki Write metodu iki sınıfta da var mı? El cevap var. Peki aynı şekilde mi çalışıyor? Hayır çalışmıyor. Demek ki bu metodu abstract metod olarak tanımlayacağız. Böyle hikaye gibi yazdım ama şimdi bu yazdıklarımı koda dökeceğiz.</p>
<p>Öncelikle abstract class ımızı tanımlayalım :</p>
<pre class="brush: csharp; title: ; notranslate">
    public abstract  class Logger
    {
        //TÜreyen her bir sınıfta override edilip, farklı şekillerde çalışabilir.
        public abstract void Write(string aciklama);

        //Türeyen tüm sınıflarda bu şekilde çalışabilir.
        public string GetHataAciklama()
        {
            return &quot;aciklama&quot;;
        }
    }
</pre>
<p>Yukarıdaki sınıfta görebileceğiniz gibi abstract metodumuzun gövdesini yazmadık. Bu metodun gövdesini türeyecek olan sınıflarda yazacağız. Logu veritabanına yazan sınıfı tanımlarken aldığımız hatayı görmenizi istedim. Diyor ki kardeşim türediğin sınıftaki abstract metodu override edeceksin, yoksa böyle hata alırsın <img src="https://s.w.org/images/core/emoji/11.2.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><img class="alignnone wp-image-57 size-full" src="http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract.png" alt="" width="912" height="171" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract.png 912w, http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract-300x56.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract-768x144.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract-810x152.png 810w" sizes="(max-width: 912px) 100vw, 912px" /></p>
<p>DbLogger ve TextLogger sınıflarında Write metodunu override ederek sınıfları tanımlıyoruz.</p>
<p><img class="alignnone wp-image-59 size-full" src="http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract2.png" alt="" width="616" height="410" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract2.png 616w, http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract2-300x200.png 300w" sizes="(max-width: 616px) 100vw, 616px" /></p>
<p>Şimdi bu classlardan bir nesne yaratalım.</p>
<p><img class="alignnone size-full wp-image-61" src="http://www.kemalburakyilmaz.com/wp-content/uploads/2017/11/abstract4.png" alt="" width="282" height="292" /></p>
<p>Gördüğünüz gibi her iki metodda nesnemizde gözükmektedir.</p>
]]></content:encoded>
										</item>
		<item>
		<title>Interface Nedir?</title>
		<link>http://www.kemalburakyilmaz.com/interface-nedir/</link>
				<pubDate>Tue, 28 Mar 2017 11:45:12 +0000</pubDate>
		<dc:creator><![CDATA[Burak Yılmaz]]></dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.kemalburakyilmaz.com/?p=529</guid>
				<description><![CDATA[Interface&#8217;ler, kendilerinden türeyen sınıflara neler yapabildiğini söyleyen kontratlardır diyebiliriz. Interface özellikleri ve yöntemleri bildirir fakat yöntemin tam olarak ne yapacağını tanımlamak sınıfa kalmıştır. Ne demek şimdi bu? Interface içerisinde içi boş metodlar yazılır yani türeyen sınıfa der ki sen bu metodların tamamını inherit edeceksin ve içerisini dolduracaksın. Örneğin projemizde loglarımızı yazmak için bir yapı kuracağız. [&#8230;]]]></description>
								<content:encoded><![CDATA[<p>Interface&#8217;ler, kendilerinden türeyen sınıflara neler yapabildiğini söyleyen kontratlardır diyebiliriz. Interface özellikleri ve yöntemleri bildirir fakat yöntemin tam olarak ne yapacağını tanımlamak sınıfa kalmıştır. Ne demek şimdi bu? Interface içerisinde içi boş metodlar yazılır yani türeyen sınıfa der ki sen bu metodların tamamını inherit edeceksin ve içerisini dolduracaksın.</p>
<p>Örneğin projemizde loglarımızı yazmak için bir yapı kuracağız. Bazı zamanlar text bir dökümana bazen veritabanına kayıt yapacağız. Şöyle bir düşününce ikisinde de LogWrite() diye bir metod olmalı diyoruz. Evet ikisinde de var ama birisi dökümana diğeri veritabanına kaydediyor yani içerikleri farklı. Hee demek ki bu ikisi için ortak bir interface yazabiliriz.</p>
<pre class="brush: csharp; title: ; notranslate"> 
    public interface ILogger
    {
        void LogWrite(string log);
    }
</pre>
<p>Yukarıda gördüğünüz gibi interface içerisinde içi boş bir metod yazdık. Bu interfaceden türeteceğimiz sınıflarda bu metod olmazsa hata alacağız.</p>
<p><img class="wp-image-534 aligncenter" src="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/03/2019-03-28-13_57_19-OopExamples-Microsoft-Visual-Studio-300x140.png" alt="" width="446" height="208" srcset="http://www.kemalburakyilmaz.com/wp-content/uploads/2019/03/2019-03-28-13_57_19-OopExamples-Microsoft-Visual-Studio-300x140.png 300w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/03/2019-03-28-13_57_19-OopExamples-Microsoft-Visual-Studio-768x359.png 768w, http://www.kemalburakyilmaz.com/wp-content/uploads/2019/03/2019-03-28-13_57_19-OopExamples-Microsoft-Visual-Studio.png 798w" sizes="(max-width: 446px) 100vw, 446px" /></p>
<p>DbLogger sınıfımızda LogWrite() metodu olmadığı için anında hatayı aldık.</p>
<p>&nbsp;</p>
<p>* Hatırlanması Gereken Noktalar :</p>
<ul>
<li>İçerisinde yalnızca boş metodlar yazılabilir.</li>
<li>Kod içerisinde &#8220;new&#8221; diyerek oluşturulamazlar.</li>
<li>Bir sınıf birden fazla interface&#8217;den türeyebilir.</li>
<li>Interface&#8217;ler başka bir interface&#8217;den türetilebilirler.</li>
<li>Interface&#8217;den türeyen sınıflarla arasında &#8220;can-do&#8221; ilişkisi vardır.</li>
</ul>
]]></content:encoded>
										</item>
	</channel>
</rss>
