https://buraksenyurt.com/Burak Selim Şenyurt - C# 6.02017-06-16T19:28:19+00:00Matematik Mühendisi Bir Bilgisayar Programcısının NotlarıBurak Selim SenyurtBlogEngine.Net Syndication Generatorhttps://buraksenyurt.com/opml.axdBurak Selim SenyurtMatematik Mühendisi Bir Bilgisayar Programcısının Notlarıtr-TRBurak Selim Şenyurt0.0000000.000000https://buraksenyurt.com/post/c-6-0-collection-initializers-ve-add-extension-metoduC# 6.0 - Collection Initializers için Add Metodunu Yönlendirmek2017-03-18T22:50:00+00:00bsenyurt<p><img style="float: right;" src="https://buraksenyurt.com/image.axd?picture=/2017/02/lego_collection_n.gif" alt="" />Merhaba Arkadaşlar,</p>
<p>Mesleki hayatımın bir döneminde yazılım eğitmeni olarak çalıştım. Ağırlıklı olarak .Net eğitimleri verdim. Tabii o zamanlar .Net nispeten daha kolaydı. Bu kadar fazla dallanan bir Framework değildi ama C# dil özellikleri de acımasızca genişlemiyordu. Aradan geçen onca yıldan sonra çalıştığım turuncu bankanın kendi akademisinden iç eğitim isteği geldi.</p>
<p>Konu C# programlama diliydi. İyi hazırlanmam gerektiği ortadaydı. Kurumsal projelerin standartları gereği en son teknolojiyi kullanamıyor olsak da C# 6.0 dünyasını yakalamıştık. Projelerimizi Visual Studio 2013 ile geliştirmekte ve .Net Framework 4.6.1 sürümünü kullanmaktayız<em>(Şimdilik)</em> Bana sanal bir makine de verdiler ve içerisine gıcır gıcır Visual Studio 2015 koydular<em>(Kurum içinde de Visual Studio 2015 yaygınlaştırılmakta)</em> </p>
<p>Hal böyle olunca C# 6.0 ile ilgili yenilikleri gözden geçirme fırsatını da yeniden yakalamış oldum. Eğitime hazırlanırken okuduğum özelliklerden birisi de Collection Initializer olarak kullanılabilen Add metodunun istediğimiz bir başka metoda atanabilmesiydi. Bu, özellikle bir koleksiyonu sarmalladığımız IEnumerable türevli tiplerde işe yarayabilecek bir yetenek. Amacımız bir sınıf örneğini oluşturduğumuz yerde içerideki koleksiyona elemanlar atayabilmek. Bunu zaten var olan koleksiyonlar için aşağıdaki gibi yapabiliyoruz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">List<string> colors=new List<string>{
"red",
"blue",
"green"
};</pre>
<p>Örneğin string tipte elemanlar barındıran colors isimli List<string> nesnesini yukarıdaki kod parçasında olduğu gibi başlatabiliriz. Nesne oluşurken içerisindeki string dizisine ilk elemanlar atanıyor.</p>
<blockquote>
<p>Hatta C# 6.0 ile Dictionary<T,K> tipinden koleksiyonları aşağıdaki gibi başlatabiliyoruz da<em>(Kod Visual Studio 2015 de yazılmıştır)</em></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">var colors = new Dictionary<int, string>
{
[100] = "Black",
[101] = "Green",
[102] = "Red"
};</pre>
</blockquote>
<p>Hedefimiz string yerine kendi tipimizi kullanıldığında benzer işlevselliği sunabilmek. Add metodunun olması bunun için yeterli ama bulunduğumuz domain gereği farklı isimli bir metoda atamak isteyebiliriz? İşte soru bu. Konuyu daha iyi anlamak için C# 6.0 öncesinden bir örnekle işe başlayalım. Elimizde aşağıdaki gibi bir sınıf olduğunu düşünelim<em>(Bu örnek Visual Studio 2013 üzerinde geliştirildi)</em></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">public class Player
{
public int PlayerId { get; set; }
public string Nickname { get; set; }
public double Level { get; set; }
public override string ToString()
{
return string.Format("{0} {1} {2}", PlayerId, Nickname, Level);
}
}</pre>
<p>Kobay sınıflarımızdan birisi olan Player tipinden generic List<T> koleksiyonu barındıran bir diğer tipimizi de aşağıdaki gibi tasarlayalım.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">public class GameSchene
:IEnumerable<Player>
{
private List<Player> players = new List<Player>();
public void Assign(Player player)
{
players.Add(player);
}
public IEnumerator<Player> GetEnumerator()
{
return ((IEnumerable<Player>)players).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<Player>)players).GetEnumerator();
}
}</pre>
<p>GameSchene sınıfı IEnumerable<Player> arayüzünü uygulamakta. Buna göre içerideki oyuncu listesi üzerinden for each döngüsü yardımıyla ilerleyebiliriz. Amacımız ise aşağıdaki gibi bir kod parçasını çalıştırabilmek.</p>
<pre class="brush:html;auto-links:false;toolbar:false" contenteditable="false">class Program
{
static void Main(string[] args)
{
var zone = new GameSchene
{
new Player{ PlayerId=102, Nickname="Maykil Cordin", Level=1000},
new Player{ PlayerId=104, Nickname="a user", Level=800},
new Player{ PlayerId=89, Nickname="black window", Level=750}
};
foreach (var p in zone)
{
Console.WriteLine(p.ToString());
}
}
}</pre>
<p>Aslında string tipinden elemanlar barındıran generic bir kolekisyonu tek ifade içerisinde nasıl başlatabiliyorsak, benzer durumu kendi koleksiyon tipimiz için de yapmak istiyoruz. Ancak kod derlenmeyecek. Nitekim koleksiyon başlatıcısı Add metodunu bekliyor. Örnekte ise Assign metodu var. </p>
<p><img src="https://buraksenyurt.com/image.axd?picture=/2017/02/c6extension_1.gif" alt="" /></p>
<p><img src="https://buraksenyurt.com/image.axd?picture=/2017/02/c6extension_3.gif" alt="" /></p>
<p>Pek tabii Assign metodunu Add olarak değiştirirsek kod başarılı bir şekilde derlenecek ve çalışacaktır. C# 6.0 tarafında ise Add metodunu extension olarak tanımlayıp istediğimiz başka bir metod ile ilişkilendirme şansına sahibiz. Tek yapmamız gereken aşağıdaki gibi bir genişletme sınıfı yazmak.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">public static class GameScheneExtensions
{
public static void Add(this GameSchene e, Player p) => e.Assign(p);
}</pre>
<p>GameSchene tipi için Add isimli bir genişletme metodu söz konusudur. Expression-Bodied Functions özelliği kullanılarak => operatörü sonrası işletilmesi istenen kod tanımlanmıştır. e.Assing(p) ile Add metodunun güncel GameSchene nesne örneğindeki Assing metoduna atanması ve initialization kısmında gelen Player nesne örneğinin parametre olarak atanması sağlanmıştır. Çalışma zamanı çıktısı aşağıdaki gibidir<em>(Örnek Visual Studio 2015 üzerinde yazılmıştır)</em></p>
<p><em><img src="https://buraksenyurt.com/image.axd?picture=/2017/02/c6extension_2.gif" alt="" /></em></p>
<p>Basit ve ince bir özellik bilgimiz olsun mutlaka işimize yarayacaktır. Böylece geldik bir yazımızın daha sonuna. Bir başka yazımızda görüşünceye dek hepinize mutlu günler dilerim.</p>2017-03-18T22:50:00+00:00c#C# 6.0extension methodcollection initializersbsenyurtC# 6.0 ile gelen yeni özelliklerden birisi de geliştirici tanımlı koleksiyonlar içerisindeki üyeler için Collection Initializers kullanılabilmesi. Bunun için Add genişletme metodunun istenen metoda atanması yeterli. Konuyu daha iyi anlamak için C# 6.0 öncesinden bir örnekle işe başlayalım. Elimizde aşağıdaki gibi bir sınıf olduğunu düşünelim.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=df5ec32a-36b1-4641-8352-7e0e5dc6a3455https://buraksenyurt.com/trackback.axd?id=df5ec32a-36b1-4641-8352-7e0e5dc6a345https://buraksenyurt.com/post/c-6-0-collection-initializers-ve-add-extension-metodu#commenthttps://buraksenyurt.com/syndication.axd?post=df5ec32a-36b1-4641-8352-7e0e5dc6a345https://buraksenyurt.com/post/C-60e28093Yeni-EsintilerC# 6.0–Yeni Esintiler2014-04-03T13:04:00+00:00bsenyurt<p><a href="https://buraksenyurt.com/pics/LegoBuild.jpg"><img style="background-image: none; float: right; padding-top: 0px; padding-left: 0px; margin: 4px 0px; display: inline; padding-right: 0px; border-width: 0px;" title="LegoBuild" src="/pics/LegoBuild_thumb.jpg" alt="LegoBuild" width="280" height="280" align="right" border="0" /></a>Merhaba Arkadaşlar,</p>
<p>Çok şanslı bir çocukluk geçirdim. 80li yıllarda daha minik bir çocukken <strong>Lego</strong>’ lar oyuncak dolabımdan eksik olmazdı. O zamanlar benim için çok kıymetliydiler. Tabi büyüdükçe başka başka şeyler önem kazanmaya başladı. <strong>Lego</strong>’ nun pabucu belki de dama atıldı. Ta ki bir oğlum olana kadar.</p>
<p>Şimdiler de 4lü yaşlarını yaşayan S(h)arp Efe’ nin en sevdiği oyuncakların başında geliyor <strong>Lego</strong>. Ülkemizdeki fiyatları her ne hikmetse yüksek olan <strong>Lego</strong>’ lardan çok fazla alamıyoruz belki ama işin güzel bir tarafı var. 80li yıllarda oynadığım ve Annem tarafından saklanan <strong>Lego</strong> parçaları günümüzdekiler ile de uyumlu. Yani var olanları yeniler ile bir arada kullanıp hayal gücümüze göre farklı farklı yapılar inşa edebiliyoruz.</p>
<p>İngilizce kelime anlamı <strong>Build</strong> olan inşa etmek(yapmak, kurmak) üzerine bu aralar uzak uzak diyarlarda da yapılmakta olan konuşmalar da var. Evet tahmin ettiğiniz gibi <strong>Microsoft</strong>’ un <strong>Build</strong> etkinlikleri dolayısıyla yazılım dünyasında hareketli günler yaşanmakta. Yeni ürünler, var olan ürünlere eklenen yeni özellikler, gelecek ile ilişkili planlamalar ve diğerleri. Konuşulabilecek ve üzerinde durulabilecek pek çok konu var. Benim dikkatimi çeken nokta ise bir süredir varlığından haberdar olduğumuz ve şu anda <strong>Roslyn</strong>’ in <strong>End User Preview</strong> sürümü ile <strong>Visual Studio 2013</strong> üzerinden anında inceleyebileceğimiz <strong>C# 6.0 </strong>dili ile ilişkili yeni kabiliyetler. Bu yazımızda söz konusu yeteneklerden bir kaçına kısaca değinmeye çalışacağım. Amacımız öncelikli olarak söz konusu bu yeteneklerin ne olduklarını kavrayabilmek.</p>
<blockquote>
<p>Dilin şu anki Preview sürümüne eklenen özellikleri zaman içerisinde değişime uğrayabilir. Ayrıca son sürüme geldikten sonra bu kabiliyetlerin bana kalırsa kendisini endüstüriyel anlamda ispat etmesi de önemlidir.</p>
</blockquote>
<h1>Ön Hazırlıklar</h1>
<p><strong>C#</strong> veya <strong>VB </strong>dillerinin gelecek nesil versiyonunda planlanan yenilikleri şimdiden test etmek için <strong>Roslyn End User Preview</strong> kullanılabilir. İlgili sürümü <a href="https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=52793" target="_blank">Bu adreste indirilebilir</a> ve kendimizi esintilerin akışına bırakabiliriz. Ayrıca güncel <strong>C#</strong> ve<strong> VB</strong> dil gelişimlerini, özellik bazında <a href="https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status&referringTitle=Documentation" target="_blank">şu adresten</a> takip edebiliriz. Bu adresteki tabloda halen planlanan, tamamlanmış olan, uzun süredir var olan veya dilin bu versiyonunda düşünülmeyen kabiliyetler tablo halinde bilgimize sunulmaktadır. <em>(Sık sık uğrayıp güncellemeleri takip etmekte yarar olduğu kanısındayım)</em></p>
<p><strong>End User Preview</strong>’ u içeriğini indirip gelen <strong>vsix</strong> dosyasını yükledikten sonra yeni özellikleri hemen denemeye başlayabiliriz. Ayrı bir proje şablonu oluşturmamıza gerek yoktur. Ben yeni özelliklerden gözüme kestirdiklerimin bir kaçını incelemek üzere, basit bir <strong>Console</strong> uygulaması üzerinden ilerlemeye çalışacağım.</p>
<h1>Auto Property Initializers</h1>
<p><strong>Auto Property</strong> uzun süredir kullanmakta olduğumuz bir dil kabiliyeti. Özellikle <strong>Entity Framework</strong> tarafında <strong>POCO<em>(Plain Old CLR Object)</em></strong> tiplerin tanımlanmasında yaygın bir şekilde ele alınmakta. Ben de açıkçası çok uzun zamandır property tanımlamalarında <strong>get</strong> ve <strong>set</strong> bloklarını kullanmıyor, sınıf içi alanlar açıkça değer atama veya onlardan veri okuma işlemlerini yazmıyorum. <strong>C# 6.0 </strong>sürümünde planlanan ve şu anda <strong>Roslyn End User Preview'</strong> da test edebildiğimiz yeni yetenek ise söz konusu <strong>Auto Property</strong>' lerin ilk değerlerinin verilmesi ile alakalı. Bu anlamda aşağıdaki kod parçasını göz önüne alabiliriz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
namespace NewFeatures
{
class Program
{
static void Main(string[] args)
{
ConnectionManager manager = new ConnectionManager();
Console.WriteLine("Client ID:{0}\nConnection String:{1}",manager.ClientID,manager.ConnectionString);
manager.ClientID = -1;
Console.WriteLine("New Client ID:{0}",manager.ClientID);
}
}
#region Auto Property Initializers
class ConnectionManager
{
public string ConnectionString { get; } = "data source=.;database=Core;integrated security=sspi";
public int ClientID { get; set; }= 99;
}
#endregion
}</pre>
<p>Bu kod parçasında görüldüğü üzere <strong>ConnectionString</strong> ve <strong>ClientID</strong> isimli özellikler tanımlandıkları satırda ilk değerlerine sahip olmaktalar. İfade noktalı virgül ile tamamlandığında hem özellik tanımını hem de bu özelliklere ait <strong>arka plan alanları<em>(Backing Field)</em></strong> için ilk değerleri vermiş oluyoruz. Bu arada <strong>ConnectionString</strong>' in <strong>sadece okunabilir<em>(Readonly)</em> </strong>bir özellik olarak tanımlandığına dikkat edelim. Çalışma zamanı sonuçlar aşağıdaki gibidir.</p>
<p><a href="https://buraksenyurt.com/pics/cs6_2.png"><img style="margin: 4px 0px; display: inline;" title="cs6_2" src="/pics/cs6_2_thumb.png" alt="cs6_2" width="503" height="81" /></a></p>
<p>Tabi arka planda yer alan <strong>IL<em>(Intermediate Language) </em></strong>görüntüsüne bakmakta da yarar var ki o da şu şekildedir.</p>
<p><a href="https://buraksenyurt.com/pics/cs6_1.png"><img style="margin: 4px 0px; display: inline;" title="cs6_1" src="/pics/cs6_1_thumb.png" alt="cs6_1" width="638" height="574" /></a></p>
<p>Dikkat edilmesi gereken nokta özellik değerlerinin <strong>ConnectionManager</strong> sınıfının <strong>yapıcı metodu<em>(Constructor)</em></strong> içerisinde atanmış olmasıdır.</p>
<h1>Primary Constructors</h1>
<p>Bildiğiniz üzere yapıcı metodların pek çok farklı versiyonu bulunmakta. <strong>Static Constructor</strong>, <strong>Copy Constructor</strong>, <strong>Default Constructor</strong> ve tabi <strong>Overload</strong> edilmiş versiyonları. Hatta yapıcı metodların <strong>base</strong> ve <strong>this</strong> anahtar kelimelerinin de işin içerisine katılmasıyla üst sınıf veya aynı sınıftaki öncelikli yapıcı metoda parametre taşıyan versiyonları da mevcut. <strong>C# 6.0</strong>’ ın planlanmış yeni kabiliyetlerinden birisi de <strong>Primary</strong> <strong>Constructor</strong> olarak karşımıza çıkmakta. Buna göre aşağıdaki gibi bir sınıf inşası mümkün.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
namespace NewFeatures
{
class Program
{
static void Main(string[] args)
{
Segment rZone = new Segment("RED", 1900);
Console.WriteLine("{0} {1}",rZone.Code,rZone.Length);
}
}
#region Primary Constructors
class Segment(string code,int length)
{
public string Code { get; }=code;
public int Length { get; }=length;
}
#endregion
}</pre>
<p>Segment isimli sınıf inşa edilirken parantezler içerisinde iki değişken tanımlaması yapıldığı görülmektedir. Bu, aslında <strong>code</strong> ve <strong>length</strong> isimli parametreleri kullanan bir <strong>yapıcı metod<em>(Constructor)</em> </strong>tanımlamasıdır. Örnekte yapıcı metodun daha anlamlı hale gelmesi adına, ilgili metod parametrelerinin <strong>Read Only</strong> olarak ifade edilmiş <strong>Auto Property</strong>' ler de ilk değerler olarak kullanılması sağlanmıştır. Dolayısıyla <strong>Segment</strong> tipinden bir nesne örneği oluşturulurken, yapıcı metod içerisinde verilen değerler aynı zaman da <strong>Code</strong> ve <strong>Length</strong> özelliklerinin set edilmesinde kullanılmaktadır. Çalışma zamanı görüntüsü aşağıdaki gibidir.</p>
<p><a href="https://buraksenyurt.com/pics/cs6_3.png"><img style="margin: 4px 0px; display: inline;" title="cs6_3" src="/pics/cs6_3_thumb.png" alt="cs6_3" width="253" height="59" /></a></p>
<p>Ama bizi asıl ilgilendiren kodun IL tarafına nasıl yansıdığıdır. İşte o görüntüler.</p>
<p><a href="https://buraksenyurt.com/pics/cs6_4.png"><img style="margin: 4px 0px; display: inline;" title="cs6_4" src="/pics/cs6_4_thumb.png" alt="cs6_4" width="614" height="584" /></a></p>
<p>Dikkat edileceği üzere yapıcı metod için <strong>code </strong>ve <strong>length</strong> isimli argumanlar tanımlanmış ve bu argumanlara ait değerler <strong>Segment</strong> ve <strong>Code</strong> özelliklerine ait alanlara <strong>ldarg.1 </strong>ve <strong>ldarg.2</strong> üzerinden atanmıştır.</p>
<p>Şu da bir gerçek ki normal şartlarda bu tip bir sınıfı aşağıdaki gibi yazardık.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">class SegmentV2
{
private string _code;
private int _length;
public int Length { get { return _length; } }
public string Code { get { return _code; } }
public SegmentV2(string code,int length)
{
_code = code;
_length = length;
}
}</pre>
<p>Ama bu, <strong>Primary Constructor</strong> özelliğinin<em> "kodu kısaltarak daha kolay ve kullanışlı hale getirmiştir"</em> şeklinde yorumlanmasını gerektirmez.</p>
<p>Primary Constructor kullanıldığında dikkat edilmesi gereken bir durumda diğer yapıcıların nasıl yazılabileceğidir. Örneğin aşağıdaki gibi bir <strong>varsayılan yapıcı metod<em>(Default Constructor)</em></strong> tanımı derleme zamanı hatasına neden olacaktır.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">class Segment(string code,int length)
{
public string Code { get; }=code;
public int Length { get; }=length;
public Segment()
{
}
}</pre>
<p><a href="https://buraksenyurt.com/pics/cs6_5.png"><img style="margin: 4px 0px; display: inline;" title="cs6_5" src="/pics/cs6_5_thumb.png" alt="cs6_5" width="640" height="143" /></a></p>
<p>Bu son derece doğaldır nitekim <strong>Primary Constructor</strong> sınıfı başlatmak için gerekli olan minimum argüman desenine sahip yapıcıyı tanımlamaktadır. Dolayısıyla aşağıdaki gibi bir kullanıma gidilmesi gerekecektir.</p>
<p><a href="https://buraksenyurt.com/pics/cs6_6.png"><img style="margin: 4px 0px; display: inline;" title="cs6_6" src="/pics/cs6_6_thumb.png" alt="cs6_6" width="353" height="97" /></a></p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
namespace NewFeatures
{
class Program
{
static void Main(string[] args)
{
Segment gZone = new Segment();
Console.WriteLine("{0} {1}", gZone.Code, gZone.Length);
}
}
#region Primary Constructors
class Segment(string code,int length)
{
public string Code { get; }=code;
public int Length { get; }=length;
public Segment()
:this("GZONE",980)
{
}
}
#endregion
}</pre>
<p><strong>IL</strong> koduna baktığımızda varsayılan yapıcı metodun beklendiği gibi <strong>Primary Constructor</strong>' un işaret ettiği fonksiyonu çağırdığı görülmektedir.</p>
<p><a href="https://buraksenyurt.com/pics/cs6_7.png"><img style="margin: 4px 0px; display: inline;" title="cs6_7" src="/pics/cs6_7_thumb.png" alt="cs6_7" width="586" height="544" /></a></p>
<h1>Static Metodlar için using Bildirimi</h1>
<p>Enteresan ve aslında hoşuma giden özelliklerden birisi de, <strong>static</strong> metodların tanımlandıkları tip adına ihtiyaç duymadan çağırılabilmeleri. Aynen aşağıda kod parçasında görüldüğü gibi.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.IO.Path;
namespace NewFeatures
{
class Program
{
static void Main(string[] args)
{
#region Static Metodların Kullanım
var logFile=Combine(Environment.CurrentDirectory, "Logs.txt");
Console.WriteLine(logFile);
#endregion
}
}
}</pre>
<p><a href="https://buraksenyurt.com/pics/cs6_8.png"><img style="margin: 4px 0px; display: inline;" title="cs6_8" src="/pics/cs6_8_thumb.png" alt="cs6_8" width="567" height="62" /></a></p>
<p>Dikkat edileceği üzere using <strong>System.IO.Path</strong> şeklinde bir bildirim yapılmıştır. Bu bildirim nedeniyle <strong>Path</strong> sınıfının <strong>static</strong> metodlarından <strong>Combine</strong>, tanımlandığı sınıf adı belirtilmeksizin kullanılabilmiştir.<em> (Normal şartlarda Path.Combine şeklinde bir kullanım olduğunu hatırlayalım)</em></p>
<p>Bu kullanım şekli <strong>genişletme metodları<em>(Extension Method)</em></strong> için de geçerlidir. Aşağıdaki kod parçasında olduğu gibi.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Data;
using NewFeatures.DataExtensions;
namespace NewFeatures
{
class Program
{
static void Main(string[] args)
{
#region Static Metodların Kullanım
LoadFromExcel(new DataTable(), "");
#endregion
}
}
static class DataExtensions
{
public static DataTable LoadFromExcel(this DataTable Table,string Source)
{
throw new NotImplementedException();
}
}
}</pre>
<p>DataExtensions sınıfı içerisinde yer alan LoadFromExcel genişletme metodunu, tip adı olmadan kullanabilmek için</p>
<p><strong>using NewFeatures.DataExtensions; </strong></p>
<p>şeklinde ki tanımlama yeterli olmuştur.</p>
<h1>Decleration Expressions</h1>
<p>Bu kabiliyeti anlamak için aşağıdaki kod parçasını göz önüne alarak işe başlamamız gerekiyor.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
namespace NewFeatures
{
class Program
{
static void Main(string[] args)
{
#region Decleration Expressions
string cDate = "2014-04-04 10:30:00";
DateTime result;
if(DateTime.TryParse(cDate, out result))
{
// do something
Console.WriteLine(result.ToString());
}
#endregion
}
}
}</pre>
<p>Tipik olarak string bir içeriğin DateTime tipine dönüşümünün TryParse metodu ile kontrollü hale getirildiği bir senaryo söz konusudur. Decleration Expressions sayesinde aynı kod parçası aşağıdaki gibi yazılabilir.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
namespace NewFeatures
{
class Program
{
static void Main(string[] args)
{
#region Decleration Expressions
string cDate = "2014-04-04 10:30:00";
if(DateTime.TryParse(cDate,out DateTime result2))
{
Console.WriteLine(result2.ToString());
}
#endregion
}
}
}</pre>
<p>Dikkat edilmesi gereken nokta tahmin edileceği üzere <strong>TryParse</strong> metodunun ikinci parametresinde bir değişken tanımının yapılmasıdır. <strong>result2</strong> parametre olarak kullanılacağı yerde aynı zamanda değişken olarak tanımlanmıştır. <strong>IL</strong> içeriğine baktığımızda beklediğimiz gibi <strong>result2’</strong> nin dışarıda bir <strong>local</strong> değişken olarak yerleştirildiği gözlemlenecektir.</p>
<p><a href="https://buraksenyurt.com/pics/cs6_9.png"><img style="margin: 4px 0px; display: inline;" title="cs6_9" src="/pics/cs6_9_thumb.png" alt="cs6_9" width="640" height="383" /></a></p>
<p>Bu yetenek özellikle out gibi parametrelerin kullanıldığı yerde ön plana çıkmaktadır.</p>
<h1>Dictionary Initializers</h1>
<p>Dictionary tipinden bir koleksiyonu nasıl oluşturursunuz? Kuvvetle muhtemel aşağıdaki kod parçasında görüldüğü gibi.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">Dictionary<int, string> values = new Dictionary<int, string>
{
{ 1,"Red" },
{9,"Green" },
{4,"Blue" }
};</pre>
<p>Aynı koleksiyonu yeni gelen Initilaization yapısı ile aşağıdaki şekilde de oluşturabilmekteyiz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">Dictionary<int, string> valuesV2 = new Dictionary<int, string>
{
[1]="Red",
[9]="Green",
[4]="Blue"
};</pre>
<p>Doğrudan index bilgisini kullanarak Microsoft’ un kaynaklarına göre daha şık bir atama söz konusu . Ancak işin asıl dikkat çekici tarafı aşağıdaki gibi yapılabilen koleksiyon tanımı.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Collections.Generic;
namespace NewFeatures
{
class Program
{
static void Main(string[] args)
{
#region Dictionary Initilaziers
var values = new Dictionary<string, string>
{
$code="G-ZONE",
$length="1900",
$creationTime=DateTime.Now.ToLongTimeString(),
$identity=Guid.NewGuid().ToString(),
$color="Green"
};
Console.WriteLine(
"{0}\n{1}\n{2}\n{3}"
, values.$code
, values.$creationTime
, values.$identity
, values.$color
);
#endregion
}
}
}</pre>
<p>Sanırım bu yazım şekli biraz daha dikkatinizi çekmiştir. <strong>values</strong> isimli generic <strong>Dictionary</strong> koleksiyonunun içeriği belirlenirken<strong> $keyName</strong> şeklinde bir kullanım söz konusudur. Bu kullanımın faydası, <strong>values</strong> değişkeninin <strong>key</strong> değerlerine erişirken kendisini göstermektedir. Her ne kadar şu anda <strong>intellisense</strong> bir yardımda bulunmasa da <strong>JSON</strong> vari bu yazım şekli oldukça kullanışlıdır. İşte çalışma zamanı sonuçları.</p>
<p><a href="https://buraksenyurt.com/pics/cs6_10.png"><img style="margin: 4px 0px; display: inline;" title="cs6_10" src="/pics/cs6_10_thumb.png" alt="cs6_10" width="269" height="93" /></a></p>
<h1>Başka Neler Var?</h1>
<p>Henüz inceleme fırsatı bulamadığım <strong>Exception Filters</strong> ve<strong> try…catch…finally</strong> bloklarında <strong>await</strong> kullanımı dışında plan dahilinde olan pek çok yeni kabiliyet gelecek dönemlerde bizleri beklemekte. Örneğin <strong>IEnumerable<T></strong> tipinin <strong>params</strong> ile metodlarda kullanılabilmesi, yapıcı metod seviyesinde tahmin edilebilirlik<em><strong>(Constructore Inference)</strong></em>, <strong>Event Initializers</strong>, <strong>private protected</strong> ve diğerleri. Plan dahilinde olan yetenekleri şu anki Preview sürümünde kullanamadım. Anlayacağınız takipte olacağız <img class="wlEmoticon wlEmoticon-winkingsmile" style="border-style: none;" src="/pics/wlEmoticon-winkingsmile_222.png" alt="Winking smile" /></p>
<h1>Sonuç</h1>
<p>Doğruyu söylemek gerekirse yeni gelen dil özelliklerinin daha yalın ve sade kod üretimi noktasında katkılar sağladığı ilk göze çarpan noktalar arasında. Bu, <strong>Clean Code</strong> olarak nitelendirdiğimiz okunabilir, yönetilebilir, bakımı daha kolay yapılabilir, hata yapma olasılığını azaltan kod parçalarının oluşmasında önemli bir dayanak noktası. Ancak söz konusu özelliklerin gerçekten hayat kurtardığı veya “farklı olarak şu işe” yaradığını söylemek için sanırım biraz erken. Ben de halen çoğunu özümsemeye ve farklı faydalarının neler olabileceğini kavramaya çalışmaktayım.</p>
<p>Önemli olan noktalardan bir diğeri aslında <strong>CLR</strong>’ ın ve <strong>IL</strong> tarafının oldukça iyi tasarlanmış olduğu gerçeği. <em>(Sanki 80li yıllardaki Lego parçalarının üstüne günümüz modellerini sorunsuz ve kolayca entegre edebilmek gibi) </em>Dikkat edileceği üzere incelediğimiz yeni yeteneklerin çoğu syntax açısından kolaylıklar gösterse de IL tarafında beklediğimiz şekillere dönüşmekte. Dolayısıyla <strong>syntax</strong> tarafında planlanan bir kabiliyetin aslında <strong>IL</strong> tarafında karşılığı olmasının, bu yeni yeteneğin ortaya konulmasının sırrı olduğunu ifade edebiliriz.</p>
<p>İlerleyen dönemlerde söz konusu özelliklerin endüstüriyel anlamda faydalarını göreceğimizi umuyorum. Böylece geldik bir yazımızın daha sonuna. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>2014-04-03T13:04:00+00:00C# 6.0new featuresbsenyurtİngilizce kelime anlamı Build olan inşa etmek(yapmak, kurmak) üzerine bu aralar uzak uzak diyarlarda da yapılmakta olan konuşmalar da var. Evet tahmin ettiğiniz gibi Microsoft’ un Build etkinlikleri dolayısıyla yazılım dünyasında hareketli günler yaşanmakta. Yeni ürünler, var olan ürünlere eklenen yeni özellikler, gelecek ile ilişkili planlamalar ve diğerleri. Konuşulabilecek ve üzerinde durulabilecek pek çok konu var. Benim dikkatimi çeken nokta ise bir süredir varlığından haberdar olduğumuz ve şu anda Roslyn’ in End User Preview sürümü ile Visual Studio 2013 üzerinden anında inceleyebileceğimiz C# 6.0 dili ile ilişkili yeni kabiliyetler. Bu yazımızda söz konusu yeteneklerden bir kaçına kısaca değinmeye çalışacağım. Amacımız öncelikli olarak söz konusu bu yeteneklerin ne olduklarını kavrayabilmek.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=43a986d1-0b70-4782-b9f2-c9e63d7438c78https://buraksenyurt.com/trackback.axd?id=43a986d1-0b70-4782-b9f2-c9e63d7438c7https://buraksenyurt.com/post/C-60e28093Yeni-Esintiler#commenthttps://buraksenyurt.com/syndication.axd?post=43a986d1-0b70-4782-b9f2-c9e63d7438c7