https://www.buraksenyurt.com/Burak Selim Şenyurt - C# 3.02011-07-21T16:02:39+00:00Matematik Mühendisi Bir Bilgisayar Programcısının NotlarıBurak Selim SenyurtBlogEngine.Net Syndication Generatorhttps://www.buraksenyurt.com/opml.axdBurak Selim SenyurtMatematik Mühendisi Bir Bilgisayar Programcısının Notlarıtr-TRBurak Selim Şenyurt0.0000000.000000https://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-17-(Query-ile-Daha-iyi-Kodlama)Tek Fotoluk İpucu-17 (Query ile Daha Şık Kodlama)2011-07-11T21:54:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>LINQ sorgularını sadece sorgulamak için kullandığımızı da nereden çıkartıyorsunuz <img class="wlEmoticon wlEmoticon-smile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" src="http://www.buraksenyurt.com/pics/wlEmoticon-smile_9.png" alt="Smile" /> Aslında onları kodlarımızı daha şık hale getirmek için de kullanabiliriz? Nasıl mı? İşte küçük bir örnek <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" src="http://www.buraksenyurt.com/pics/wlEmoticon-winkingsmile_35.png" alt="Winking smile" /></p>
<p><a href="http://www.buraksenyurt.com/pics/PhotoTrick17.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="PhotoTrick17" src="http://www.buraksenyurt.com/pics/PhotoTrick17_thumb.png" border="0" alt="PhotoTrick17" width="641" height="705" /></a></p>
<p><a href="http://www.buraksenyurt.com/pics/2011%2f7%2fShortCodes.rar">ShortCodes.rar (22,69 kb)</a></p>2011-07-11T21:54:00+00:00c#linqenumerablebsenyurthttps://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=4fd2abb3-4486-4fb4-aacd-36450dbfae4c3https://www.buraksenyurt.com/trackback.axd?id=4fd2abb3-4486-4fb4-aacd-36450dbfae4chttps://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-17-(Query-ile-Daha-iyi-Kodlama)#commenthttps://www.buraksenyurt.com/syndication.axd?post=4fd2abb3-4486-4fb4-aacd-36450dbfae4chttps://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-16-(Dynamic-Var)Tek Fotoluk İpucu-16 (Dynamic Var)2011-07-10T21:41:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>LINQ tarafında isimsiz tipleri(Anonymous Types) oldukça sık kullanmaktayız. Ancak isimsiz tiplerin metodlara parametre olarak geçirilemediğini de biliyoruz <img class="wlEmoticon wlEmoticon-sadsmile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" src="http://www.buraksenyurt.com/pics/wlEmoticon-sadsmile_4.png" alt="Sad smile" /> Çünkü bu tipler derleyici tarafından üretiliyorlar. Ama üzülmeyin. Çünkü elimizde 4.0 ile gelen dynamic anahtar kelimesi var. Peki nasıl kullanırız? <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" src="http://www.buraksenyurt.com/pics/wlEmoticon-winkingsmile_34.png" alt="Winking smile" /></p>
<p><a href="http://www.buraksenyurt.com/pics/PhotoTrick16New.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="PhotoTrick16New" src="http://www.buraksenyurt.com/pics/PhotoTrick16New_thumb.png" border="0" alt="PhotoTrick16New" width="639" height="763" /></a></p>
<p><a href="http://www.buraksenyurt.com/pics/2011%2f7%2fDynamicVar.rar">DynamicVar.rar (26,49 kb)</a></p>2011-07-10T21:41:00+00:00c#c# 3.0c# 4.0c# temelleridynamicvardynamic language runtimebsenyurthttps://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=37d8655d-e7f3-4917-9047-58611862e6111https://www.buraksenyurt.com/trackback.axd?id=37d8655d-e7f3-4917-9047-58611862e611https://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-16-(Dynamic-Var)#commenthttps://www.buraksenyurt.com/syndication.axd?post=37d8655d-e7f3-4917-9047-58611862e611https://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-5Tek Fotoluk İpucu - 5 (Rastgele Sıralı Generic List Koleksiyonu)2011-06-23T21:15:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Elinizde List tipinden bir koleksiyon var ve içerisindeki nesnelerden rastgele sırada yeni bir liste kullanmak istiyorsunuz. Ne yaparsınız? İşte cevabı <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" src="http://www.buraksenyurt.com/pics/wlEmoticon-winkingsmile_23.png" alt="Winking smile" /></p>
<p><a href="http://www.buraksenyurt.com/pics/PhotoTip5.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="PhotoTip5" src="http://www.buraksenyurt.com/pics/PhotoTip5_thumb.png" border="0" alt="PhotoTip5" width="630" height="568" /></a></p>
<p><a href="http://www.buraksenyurt.com/pics/2011%2f6%2fRandomList.rar">RandomList.rar (22,53 kb)</a></p>2011-06-23T21:15:00+00:00c#c# 3.0c# 4.0c# temellerilinqlistgeneric listcollectionsbsenyurthttps://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=fdd9857a-d6d3-4fec-b286-b77c235f3ecf2https://www.buraksenyurt.com/trackback.axd?id=fdd9857a-d6d3-4fec-b286-b77c235f3ecfhttps://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-5#commenthttps://www.buraksenyurt.com/syndication.axd?post=fdd9857a-d6d3-4fec-b286-b77c235f3ecfhttps://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-2Tek Fotoluk İpucu - 2 (StackTrace ve Çalışma Zamanı Metod Bilgisi)2011-06-22T01:48:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Hani olurda çalışma zamanında(Runtime) o anda yürütülmekte olan metodun bilgilerine kolayca ulaşmak istersiniz. Özellikle loglama sistemlerinde. İşte bu durumda <strong>StackTrace </strong>tipinden yararlanabilirsiniz. Nasıl mı? Aşağıdaki fotoğrafta<em>(ya da Ercan Hocamızın belirttiği üzere Screen Capture' da)</em> görüldüğü gibi <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" src="http://www.buraksenyurt.com/pics/wlEmoticon-winkingsmile_22.png" alt="Winking smile" /></p>
<h3><a href="http://www.buraksenyurt.com/pics/PhotoTrick2.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 4px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="PhotoTrick2" src="http://www.buraksenyurt.com/pics/PhotoTrick2_thumb.png" border="0" alt="PhotoTrick2" width="633" height="574" /></a></h3>
<h3><span style="font-size: 10px; font-weight: normal;"><a href="http://www.buraksenyurt.com/pics/2011%2f6%2fSmartLogger.rar">SmartLogger.rar (21,41 kb)</a></span></h3>2011-06-22T01:48:00+00:00c#system.diagnosticsstacktracerun timereflection.net frameworkbsenyurthttps://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=13602f66-8be4-42d6-b865-10a8bdd345201https://www.buraksenyurt.com/trackback.axd?id=13602f66-8be4-42d6-b865-10a8bdd34520https://www.buraksenyurt.com/post/Tek-Fotoluk-Ipucu-2#commenthttps://www.buraksenyurt.com/syndication.axd?post=13602f66-8be4-42d6-b865-10a8bdd34520https://www.buraksenyurt.com/post/Object-Initializer-Deyip-Gecmemek-Lazc4b1mNetspecter Takipte - Object Initializer Deyip Geçmemek Lazım2011-04-14T14:34:00+00:00bsenyurt<p><a href="https://www.buraksenyurt.com/pics/blg229_Giris.gif"><img style="margin: 4px 0px; display: inline; border-width: 0px;" title="blg229_Giris" src="/pics/blg229_Giris_thumb.gif" alt="blg229_Giris" width="324" height="196" align="right" border="0" /></a>Merhaba Arkadaşlar,</p>
<p>Puslu bir sonbahar akşamında detektif <strong>Netspecter</strong> odasında sessiz sakin oturmaktadır. Loş bir ortama neden olan gece lambasının yeşil cam aksamı altından oda içerisindeki tozların sessiz ve sakin akışı bir yana, <strong>Netspecter</strong>’ ın kafasında masasına yeni gelen dosya ile ilişkili soru işaretleri koşup durmaktadır.</p>
<p>Sıkıntılı geçen bir kaç saat sonrasında aniden telefon çalar. Ölüm sessizliği içerisinde olan odanın neredeyse canlanmasına neden olan bir çalıştır bu. Ahizeyi ancak bir kaç seferden sonra fark edip kulağına götüren <strong>Netspecter</strong>, karşısında acı çektiği belli olan bir inleme ile irkilir.</p>
<p><strong>Diğer ses :</strong> Objjj….eeeccttt!!!</p>
<p><strong>Netspector : </strong>Kimsiniz</p>
<p><strong>Diğer ses : </strong>Obb…ect!!!</p>
<p><strong>Netspector : </strong>Oba makarnası mı? Nalo, nalooo…Anlamıyorum. Etecer mi?</p>
<p><strong>Diğer ses :</strong> Aghhh!!!</p>
<p><strong>Netspector : </strong>Ha ağrı kesici?</p>
<p><strong>Diğer ses :</strong> Object Iniiittt….rrrr!!!</p>
<p><strong>Diğer taraf : </strong>Dıt dıt dıt dıtttt!!!</p>
<p>Derken telefon sesi aniden kesilir. <strong>Netspector</strong> hemen sandalyesinde çabucak doğrulur, fotör şapkasını takar ve kapıdan hızla çıkar. Sevgili kedisi <strong>CAD</strong> ise bu telaşı umursamadan yemek kabındaki sütünü içmeye devam etmekte ve her içişten sonra patilerini temizlemektedir. Aslında <strong>Netspector’</strong> ın kafasındaki güzergah bellidir. Şehir merkezinde ki büyük <strong>MSDN</strong> kütüpahnesine uğrayacak ve <strong>Object Initializer</strong> ile ilgili bir kaç soru sorup olayı çözmeye çalışacaktır.</p>
<h2><strong>Asıl Mevzu</strong></h2>
<p><strong>C# 3.0</strong> ile birlikte gelen önemli yeniliklerden birisi de <strong>Object Initializers </strong>kullanımı idi. Bu kullanım sayesinde özellikle <strong>LINQ(Language Integrated Query)</strong> sorgularında <strong>Anonymous Type </strong>üretiminin mümkün hale gelmesi de sağlanmaktaydı. Dolayısıyla her zaman ifade ettiğimiz gibi bu yenilik, başka bir yeniliğin yapılabilmesi için getirilmiş bir yenilikti <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /></p>
<p>Tabi o zamandan beri <strong>Object Initializers </strong>kavramı üzerinde çok fazla yazıp çizdim ama yine de pek fazla derinlerine girmediğimi ya da olaya farklı gözeler ile bakmadığımı farkettim. Bu nedenle konuyu farklı bir yaklaşım ile ele almanın daha doğru olacağına karar verdim. Dilerseniz kavramın derinliklerine inerken örnek bir kod parçası ile küçük bir başlangıç yapmaya çalışalım. Bu amaçla <strong>Visual Studio 2010 </strong>ortamında aşağıdaki <strong>Converter </strong>isimli sınıfı kullanan bir <strong>Console </strong>uygulamasını göz önüne alıyor olacağız.</p>
<p><a href="https://www.buraksenyurt.com/pics/blg229_ConverterClassDiagram.gif"><img style="display: inline; border-width: 0px;" title="blg229_ConverterClassDiagram" src="/pics/blg229_ConverterClassDiagram_thumb.gif" alt="blg229_ConverterClassDiagram" width="207" height="142" border="0" /></a></p>
<p>Örnek program kodunu ise aşağıdaki gibi geliştirebiliriz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">namespace CaseObjectInitializers
{
class Program
{
static void Main(string[] args)
{
//Object Initializer kullanarak nesneyi başlatmak
Converter cvrtr = new Converter { Source = "c:\\source.xls", Target = "c:\\target.txt" };
// Klasik yöntem. Önce varsayılan yapıcı metod çağrısı, ardından özelliklere değer atama yolu ile başlatmak
Converter cvrt2 = new Converter();
cvrt2.Source = "c:\\source.xls";
cvrt2.Target = ":\\target.text";
}
}
class Converter
{
public string Source { get; set; }
public string Target { get; set; }
}
}</pre>
<p>Bu kod parçasında dikkat edileceği üzere <strong>Converter</strong> tipinden iki farklı nesne örneklenmesi yapılmaktadır. <strong>cvrtr</strong> isimli ilk değişkenin üretimi sırasında <strong>object initializer </strong>tekniği kullanılmış ve süslü parantezler içerisinde <strong>public</strong> olan söz konusu tipe ait <strong>Source</strong> ve <strong>Target </strong>özelliklerine bazı değerler verilmiştir. <strong>cvrt2</strong> isimli değişkenin oluşturulma şekli ise tam bir klasiktir <img title="Smile" src="/editors/tiny_mce3/plugins/emotions/img/smiley-smile.gif" alt="Smile" border="0" /> İlk olarak <strong>varsayılan yapıcı(Default Constructor) </strong>metoddan yararlanılmış ve sonrasında örnek nesne üzerinden <strong>Source</strong> ve <strong>Target </strong>özelliklerine değerleri atanmıştır. Çok güzel. Güzel ama ilk örnekleme işleminde kullanılan <strong>Object Initializer </strong>tekniği aslında bir sihir mi uygulamıştır?</p>
<blockquote>
<p>Detektifin konuyu çözmesi için ipuçlarını daha iyi görebileceği bir aygıta ve örneğe ihtiyacı vardır. Karanlık odayı loş bir şekilde aydınlatan ışığın altında düşünürken, aklına parlak bir fikir gelir. Mikroskop olarak daha bir kaç gün öncesinde kermesten aldığı eski pentium işlemcili makinede yer alan ILDASM aracını, örnek olarakta makdulun salonda bıraktığı Console uygulamasına ait exe çıktısını kullanacaktır.</p>
</blockquote>
<p><strong>ILDASM(Intermediate Language DisASeMbler Tool)</strong> aracı yardımıyla gerekli <strong>IL</strong> çıktısına baktığımızda aşağıdaki sonuçlar ile karşılaşırız.</p>
<pre class="brush:plain;auto-links:false;toolbar:false" contenteditable="false">.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 64 (0x40)
.maxstack 2
.locals init ([0] class CaseObjectInitializers.Converter cvrtr,
[1] class CaseObjectInitializers.Converter cvrt2,
[2] class CaseObjectInitializers.Converter '<>g__initLocal0')
IL_0000: nop
IL_0001: newobj instance void CaseObjectInitializers.Converter::.ctor()
IL_0006: stloc.2
IL_0007: ldloc.2
IL_0008: ldstr "c:\\source.xls"
IL_000d: callvirt instance void CaseObjectInitializers.Converter::set_Source(string)
IL_0012: nop
IL_0013: ldloc.2
IL_0014: ldstr "c:\\target.txt"
IL_0019: callvirt instance void CaseObjectInitializers.Converter::set_Target(string)
IL_001e: nop
IL_001f: ldloc.2
IL_0020: stloc.0
IL_0021: newobj instance void CaseObjectInitializers.Converter::.ctor()
IL_0026: stloc.1
IL_0027: ldloc.1
IL_0028: ldstr "c:\\source.xls"
IL_002d: callvirt instance void CaseObjectInitializers.Converter::set_Source(string)
IL_0032: nop
IL_0033: ldloc.1
IL_0034: ldstr ":\\target.text"
IL_0039: callvirt instance void CaseObjectInitializers.Converter::set_Target(string)
IL_003e: nop
IL_003f: ret
} // end of method Program::Main</pre>
<p>Dikkat edileceği üzere <strong>IL_0001</strong> satırından <strong>Converter</strong> tipine ait <strong>varsayılan yapıcı metod(Default Constructor) </strong>çağırılmıştır. <strong>IL_000d </strong>numaralı satırda ise <strong>Source </strong>özelliği için <strong>set </strong>metodunun çağırıldığı görülmektedir. Diğer yandan benzer işlem <strong>IL_0019 </strong>numaralı satırda da yapılmaktadır. Özetlemek gerekirse <strong>Object Initializer </strong>kullandığımızda aslında klasik yöntem de uygulanan önce yapıcı metodun çağırılması ve sonrasında özelliklere değer atanması işlemi <strong>IL </strong>tarafında aynen yapılmaktadır. Hatta koleksiyonları <strong>initializer </strong>ile başlatttığımız durumlarda da benzer bir üretim modeli söz konusu olacaktır. Bu durumu da analiz edersek yerinde olur mu? Olur <img title="Laughing" src="/editors/tiny_mce3/plugins/emotions/img/smiley-laughing.gif" alt="Laughing" border="0" /> Bu amaçla uygulamamıza aşağıdaki kod satırlarını eklediğimizi düşünelim.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">List<Converter> converters = new List<Converter>
{
new Converter{Source="c:\\source1.xls",Target="C:\\target1.txt"},
new Converter{Source="c:\\source2.xls",Target="C:\\target2.txt"},
new Converter{Source="c:\\source3.xls",Target="C:\\target3.txt"},
};</pre>
<p>Bu sefer hem <strong>List<T> </strong>tipi için hem de içerisine eklenen her bir <strong>Converter </strong>tipi için yapılan örnekleme işlemlerinde <strong>Object Initializer </strong>tekniği kullanılmıştır. Bildiğiniz üzere <strong>IEnumerable</strong> arayüzünü uygulayan ve <strong>Add </strong>metodunu içeren koleksiyon tipleri için de <strong>Object Initializer </strong>tekniğinden yararlanılabilmektedir. Peki ya <strong>IL </strong>çıktısı? <img title="Sealed" src="/editors/tiny_mce3/plugins/emotions/img/smiley-sealed.gif" alt="Sealed" border="0" /></p>
<pre class="brush:plain;auto-links:false;toolbar:false" contenteditable="false">.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 203 (0xcb)
.maxstack 3
.locals init ([0] class CaseObjectInitializers.Converter cvrtr,
[1] class CaseObjectInitializers.Converter cvrt2,
[2] class [mscorlib]System.Collections.Generic.List`1<class CaseObjectInitializers.Converter> converters,
[3] class CaseObjectInitializers.Converter '<>g__initLocal0',
[4] class [mscorlib]System.Collections.Generic.List`1<class CaseObjectInitializers.Converter> '<>g__initLocal1',
[5] class CaseObjectInitializers.Converter '<>g__initLocal2',
[6] class CaseObjectInitializers.Converter '<>g__initLocal3',
[7] class CaseObjectInitializers.Converter '<>g__initLocal4')
IL_0000: nop
IL_0001: newobj instance void CaseObjectInitializers.Converter::.ctor()
IL_0006: stloc.3
IL_0007: ldloc.3
IL_0008: ldstr "c:\\source.xls"
IL_000d: callvirt instance void CaseObjectInitializers.Converter::set_Source(string)
IL_0012: nop
IL_0013: ldloc.3
IL_0014: ldstr "c:\\target.txt"
IL_0019: callvirt instance void CaseObjectInitializers.Converter::set_Target(string)
IL_001e: nop
IL_001f: ldloc.3
IL_0020: stloc.0
IL_0021: newobj instance void CaseObjectInitializers.Converter::.ctor()
IL_0026: stloc.1
IL_0027: ldloc.1
IL_0028: ldstr "c:\\source.xls"
IL_002d: callvirt instance void CaseObjectInitializers.Converter::set_Source(string)
IL_0032: nop
IL_0033: ldloc.1
IL_0034: ldstr ":\\target.text"
IL_0039: callvirt instance void CaseObjectInitializers.Converter::set_Target(string)
IL_003e: nop
IL_003f: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class CaseObjectInitializers.Converter>::.ctor()
IL_0044: stloc.s '<>g__initLocal1'
IL_0046: ldloc.s '<>g__initLocal1'
IL_0048: newobj instance void CaseObjectInitializers.Converter::.ctor()
IL_004d: stloc.s '<>g__initLocal2'
IL_004f: ldloc.s '<>g__initLocal2'
IL_0051: ldstr "c:\\source1.xls"
IL_0056: callvirt instance void CaseObjectInitializers.Converter::set_Source(string)
IL_005b: nop
IL_005c: ldloc.s '<>g__initLocal2'
IL_005e: ldstr "C:\\target1.txt"
IL_0063: callvirt instance void CaseObjectInitializers.Converter::set_Target(string)
IL_0068: nop
IL_0069: ldloc.s '<>g__initLocal2'
IL_006b: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class CaseObjectInitializers.Converter>::Add(!0)
IL_0070: nop
IL_0071: ldloc.s '<>g__initLocal1'
IL_0073: newobj instance void CaseObjectInitializers.Converter::.ctor()
IL_0078: stloc.s '<>g__initLocal3'
IL_007a: ldloc.s '<>g__initLocal3'
IL_007c: ldstr "c:\\source2.xls"
IL_0081: callvirt instance void CaseObjectInitializers.Converter::set_Source(string)
IL_0086: nop
IL_0087: ldloc.s '<>g__initLocal3'
IL_0089: ldstr "C:\\target2.txt"
IL_008e: callvirt instance void CaseObjectInitializers.Converter::set_Target(string)
IL_0093: nop
IL_0094: ldloc.s '<>g__initLocal3'
IL_0096: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class CaseObjectInitializers.Converter>::Add(!0)
IL_009b: nop
IL_009c: ldloc.s '<>g__initLocal1'
IL_009e: newobj instance void CaseObjectInitializers.Converter::.ctor()
IL_00a3: stloc.s '<>g__initLocal4'
IL_00a5: ldloc.s '<>g__initLocal4'
IL_00a7: ldstr "c:\\source3.xls"
IL_00ac: callvirt instance void CaseObjectInitializers.Converter::set_Source(string)
IL_00b1: nop
IL_00b2: ldloc.s '<>g__initLocal4'
IL_00b4: ldstr "C:\\target3.txt"
IL_00b9: callvirt instance void CaseObjectInitializers.Converter::set_Target(string)
IL_00be: nop
IL_00bf: ldloc.s '<>g__initLocal4'
IL_00c1: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<class CaseObjectInitializers.Converter>::Add(!0)
IL_00c6: nop
IL_00c7: ldloc.s '<>g__initLocal1'
IL_00c9: stloc.2
IL_00ca: ret
} // end of method Program::Main</pre>
<p>Haydi gelin bir çılgınlık yapalım ve bu <strong>IL</strong> kodunu okumaya çalışalım <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> Dikkat edileceği üzere<strong> IL_003f</strong> satırında <strong>List<Converter></strong> tipi için <strong>varsayılan yapıcı metod</strong> çağrısı gerçekleştirilmektedir. Dolayısıyla bu satırda ilgili koleksiyona ait bir nesne örneğinin ürettirildiğini düşünebiliriz. Diğer yandan<strong> IL_0048</strong> numaralı satırda bir <strong>Converter</strong> tipi örneklemesi için varsayılan yapıcı metod çağrısı söz konusudur. <strong>IL_0056</strong> ve <strong>IL_0063 </strong>numaralı satırlarda ise, <strong>IL_0048’</strong> de üretilen <strong>Converter</strong> nesnesine ait özelliklerin(Source ve Target) değerleri atanmaktadır. <strong>IL_006b</strong> satırında ise <strong>IL_0048</strong>’ de üretilen ve <strong>IL_0056 </strong>ile <strong>IL_0063 </strong>satırlarında sırasıyla <strong>Source</strong> ve <strong>Target</strong> özelliklerine değer atanan <strong>Converter</strong> nesne örneğinin <strong>IL_003f </strong>satırında örneklenen <strong>List<Converter> </strong>tipli koleksiyon örneğine <strong>Add</strong> metodu ile eklendiği gözlemlenmektedir. Bu <strong>IL</strong> çağrı akışı diğer iki <strong>Converter </strong>nesne örneği için de geçerli olacaktır.</p>
<p>Sanıyorum ki <strong>Object Initializer </strong>tekniği hakkında biraz daha derin fikir sahibi olmaya başladık. Yeter mi? Yetmez. Bakın daha neler var?</p>
<p><strong>beforefieldinit</strong></p>
<p>Örneğimize aşağıdaki sınıf örneğini eklediğimi düşünelim.</p>
<p><a href="https://www.buraksenyurt.com/pics/blg229_FileManagerClassDiagram.gif"><img style="display: inline; border-width: 0px;" title="blg229_FileManagerClassDiagram" src="/pics/blg229_FileManagerClassDiagram_thumb.gif" alt="blg229_FileManagerClassDiagram" width="234" height="166" border="0" /></a></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">static class FileManager
{
static List<Converter> _converters = new List<Converter>();
static FileManager()
{
Converter c1 = new Converter();
c1.Source = "c:\\sourcex.xls";
c1.Target = "c:\\targetx.txt";
_converters.Add(c1);
Converter c2 = new Converter();
c2.Source = "c:\\sourcez.xls";
c2.Target = "c:\\targetz.txt";
_converters.Add(c2);
}
}</pre>
<p><strong>FileManager</strong> static tipli bir sınıf olmakla birlikte <strong>_converters </strong>isimli <strong>List<Converter> </strong>koleksiyonu türünden bir alan içermekedir. Söz konusu alan tanımlandığı yerde <strong>new</strong> operatörü ile örneklenmiş ve ilk değerlerinin atanması için <strong>FileManager</strong> <strong>static </strong>yapıcı metodu kullanılmıştır. Söz konusu sınıfın <strong>IL </strong>çıktısına baktığımızda özellikle sınıf tanımının aşağıdaki şekilde olduğu gibi yapıldığı görülecektir.</p>
<p><a href="https://www.buraksenyurt.com/pics/blg229_FileManagerIL1.gif"><img style="display: inline; border-width: 0px;" title="blg229_FileManagerIL1" src="/pics/blg229_FileManagerIL1_thumb.gif" alt="blg229_FileManagerIL1" width="298" height="151" border="0" /></a></p>
<p>Şimdi sınıf kodunu biraz daha değiştirelim.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">static class FileManager
{
static List<Converter> _converters = new List<Converter>
{
new Converter{Source="c:\\sourcesx.xls",Target="c:\\targetx.txt"},
new Converter{Source="c:\\sourcesz.xls",Target="c:\\targetz.txt"}
};
}</pre>
<p><strong>FileManager</strong> tipinin yeni versiyonunda <strong>_converters </strong>isimli koleksiyon örneğini oluşturmak için <strong>static yapıcı metod </strong>yerine <strong>object initializer </strong>kullandığımızı görmekteyiz. Bu durumda uygulamanın <strong>IL </strong>çıktısına baktığımızda <strong>FileManager </strong>tipi için aşağıdaki tanımlamanın yapıldığına şahit oluruz.</p>
<p><a href="https://www.buraksenyurt.com/pics/blg229_FileManagerIL2.gif"><img style="display: inline; border-width: 0px;" title="blg229_FileManagerIL2" src="/pics/blg229_FileManagerIL2_thumb.gif" alt="blg229_FileManagerIL2" width="417" height="216" border="0" /></a></p>
<p>İki örneğe ait tanımlamalara baktığımızda <strong>beforefieldinit</strong> isimli bir değerin kullanıldığı fark edilmektedir. Aslında bu değerin uygulama performansını arttırıcı bir etkisi olduğunu ifade edebiliriz. Normalde static yapıcı metod kullandığımızda, tip içerisinde yer alan tüm static değişkenlerin ilk erişimlerinden önce örneklenip örneklenmediklerine dair bir kontrol işlemi uygulanmaktadır. Ancak son kod parçamızda olduğu gibi<strong> Object Initializer </strong>kullanır ve static yapıcı metodu dışarıda bırakırsak, bu durumda sınıf söz konusu <strong>beforrefiledinit</strong> özelliği ile işaretlenerek ilgili kontrol işleminin atlanması sağlanır. Bu da azıcık bile olsa performans kazanımı anlamına gelmektedir <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /></p>
<p>Görüldüğü üzere <strong>Object Initializer </strong>karvramını sadece kodun yazımını kısaltan bir yenilik şeklinde düşünmemek gerekir. Ancak yazım ve kod okunurluğunu kolaylaştırdığı da bir gerçektir. Bunun için aşağıdaki tabloya bakmanız sanırım yeterli olacaktır <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /></p>
<table style="width: 640px;" border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="281"><strong>Klasik Yaklaşım</strong></td>
<td valign="top" width="357"><strong>Object Initializer ile Yaklaşım</strong></td>
</tr>
<tr>
<td valign="top" width="281">
<p>using System.Collections.Generic;</p>
<p>namespace CaseObjectInitializers <br />{ <br /> class Program <br /> { <br /> static void Main(string[] args) <br /> { <br /> List<Book> books = new List<Book>();</p>
<p> Book newBook = new Book(); <br /> newBook.Id = 1; <br /> newBook.Name = "Dick Tracy Maceraları 1"; <br /> newBook.Summary = "İlk bölüm maceraları"; <br /> newBook.ListPrice = 10; <br /> newBook.Authors = new List<Author>();</p>
<p> Author newAuthor = new Author(); <br /> newAuthor.Id = 1; <br /> newAuthor.Name = "Dick"; <br /> newAuthor.Surname = "Tracy"; <br /> newBook.Authors.Add(newAuthor);</p>
<p> books.Add(newBook); <br /> newBook = new Book(); <br /> newBook.Id = 2; <br /> newBook.Name = "Uygulamalı WCF"; <br /> newBook.Summary = "İlk denemeler"; <br /> newBook.ListPrice = 34.49M; <br /> newBook.Authors = new List<Author>();</p>
<p> newAuthor = new Author(); <br /> newAuthor.Id = 3; <br /> newAuthor.Name = "Burak S."; <br /> newAuthor.Surname = "Şenyurt"; <br /> newBook.Authors.Add(newAuthor);</p>
<p> newAuthor = new Author(); <br /> newAuthor.Id = 4; <br /> newAuthor.Name = "Ingo"; <br /> newAuthor.Surname = "Rammer"; <br /> newBook.Authors.Add(newAuthor);</p>
<p> books.Add(newBook); <br /> } <br /> }</p>
<p> class Book <br /> { <br /> public int Id { get; set; } <br /> public string Name { get; set; } <br /> public List<Author> Authors{ get; set; } <br /> public string Summary { get; set; } <br /> public decimal ListPrice { get; set; } <br /> }</p>
<p> class Author <br /> { <br /> public int Id { get; set; } <br /> public string Name { get; set; } <br /> public string Surname { get; set; } <br /> } <br />}</p>
</td>
<td valign="top" width="357">
<p>using System.Collections.Generic;</p>
<p>namespace CaseObjectInitializers <br />{ <br /> class Program <br /> { <br /> static void Main(string[] args) <br /> { <br /> List<Book> books = new List<Book> <br /> { <br /> new Book{Id=1, Name="Dick Tracy Maceraları 1", Summary="İlk bölüm maceraları", ListPrice=10 <br /> , Authors=new List<Author>{ <br /> new Author{Id=1, Name="Dick", Surname="Tracy"} <br /> } <br /> }, <br /> new Book{Id=2,Name="Uygulamalı WCF", Summary="İlk denemeler", ListPrice=34.59M <br /> ,Authors=new List<Author>{ <br /> new Author{Id=3,Name="Burak S",Surname="Şenyurt"}, <br /> new Author{Id=4,Name="Ingo",Surname="Rammer"} <br /> } <br /> } <br /> }; <br /> } <br /> }</p>
<p> class Book <br /> { <br /> public int Id { get; set; } <br /> public string Name { get; set; } <br /> public List<Author> Authors{ get; set; } <br /> public string Summary { get; set; } <br /> public decimal ListPrice { get; set; } <br /> }</p>
<p> class Author <br /> { <br /> public int Id { get; set; } <br /> public string Name { get; set; } <br /> public string Surname { get; set; } <br /> } <br />}</p>
</td>
</tr>
<tr>
<td valign="top" width="281">book koleksiyonunun oluşturulması için <strong>36</strong> satır</td>
<td valign="top" width="357">book koleksiyonunun oluşturulması için <strong>13</strong> satır</td>
</tr>
</tbody>
</table>
<p> </p>
<p>Her iki örnek kod parçasında da <strong>Book</strong> tipinden nesne örnekleri taşıyan birer <strong>List<T> </strong>koleksiyonu oluşturulmakta ve doldurulmaktadır. <strong>Book</strong> tipi içerisinde <strong>Author</strong> tipinden de bir koleksiyon da yer almaktadır. Tabi <strong>Book</strong> ve <strong>Author </strong>sınıfları için <strong>aşırı yüklenmiş yapıcı metodlar(Overloaded Constructors)</strong> olmadığını varsayıyoruz bu senaryo da. Kodun daha da kısalması, performans yönündeki minik fark göz önüne alındığında biraz daha önemsiz gibi duruyor. Yine de çok fazla sayıda kod parçası içeren projelerde kodun okunurluğunun da geliştiricinin psikolojisi üzerinde doğrudan etkili olduğunu ifade etmek isterim. Böylece geldik bir yazımızın daha sonuna. <strong>Netspecter</strong>’ ın bir sonraki macerasında görüşünceye dek hepinize mutlu günler dilerim.</p>
<p><a href="https://www.buraksenyurt.com/pics/2010%2f9%2fCaseObjectInitializers.rar">CaseObjectInitializers.rar (23,71 kb)</a></p>2011-04-14T14:34:00+00:00c#c# 3.0c# temelleribsenyurtC# 3.0 ile birlikte gelen önemli yeniliklerden birisi de Object Initializers kullanımı idi. Bu kullanım sayesinde özellikle LINQ(Language Integrated Query) sorgularında Anonymous Type üretiminin mümkün hale gelmesi de sağlanmaktaydı. Dolayısıyla her zaman ifade ettiğimiz gibi bu yenilik, başka bir yeniliğin yapılabilmesi için getirilmiş bir yenilikti.https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=46da14cd-2cf9-45a1-9fe4-d9028392f1590https://www.buraksenyurt.com/trackback.axd?id=46da14cd-2cf9-45a1-9fe4-d9028392f159https://www.buraksenyurt.com/post/Object-Initializer-Deyip-Gecmemek-Lazc4b1m#commenthttps://www.buraksenyurt.com/syndication.axd?post=46da14cd-2cf9-45a1-9fe4-d9028392f159