İlkay İlknur

just a developer...

Microsoft Connect Etkinliğinden Notlar

Geçtiğimiz haftalarda düzenlenen Microsoft Connect etkiliğinde duyurulan yeniliklerle ilgili kısa bir video çektim.

Video içerisinde değindiğim konulara ait linkler

Umarım faydalı olur.



Expando Object İçerisine Dinamik Olarak Member Ekleme

C# 4.0'daki dynamic yenilikleri ile beraber hayatımıza giren tiplerden biri de ExpandoObject. Bu tip ne işe yarıyor diye ufak bir hatırlatma yaparsak, ExpandoObject'in içerisine runtime'da dinamik olarak member eklenebiliyor. Örneğin,

class Program
{
    static void Main(string[] args)
    {
        dynamic d = new ExpandoObject();
        d.Foo = "foo";
        d.Bar = 4;

        Console.WriteLine("Foo=" + d.Foo);
        Console.WriteLine("Bar=" + d.Bar.ToString());
    }
}

Gördüğünüz gibi runtimeda Foo ve Bar fieldlarını ekledik ve sonrasında da bu fieldları ekrana yazdırdık. Buraya kadar olan kısmını zaten ExpandoObjecti biliyorsanız size yabancı gelmeyecektir.

ExpandoObject kullanırken oluşabilecek olan ihtiyaçlardan biri de ExpandoObject içerisine koyacağımız alanların runtimeda belirlenmesi olabilir. Yani üstteki örnekteki Foo ve Bar alanlarının isimlerinin ve valuelarının database'den geldiğini düşünün. Kodunuza göre bu alanların adı Foo ve Bar olabiliyorken aynı zamanda Ahmet ve Mehmet de olabilir. Bu tamamen databaseden gelecek sonuca bağlı. Bu durumda haliyle d.Foo veya d.Ahmet gibi birşey yapamıyoruz.  Çünkü ne geleceği belli değil. Peki burada nasıl ilerleyebiliriz ?

ExpandoObject'in tanımına bakarsınız IDictionary<string, object> interface'ini implemente ettiğini görürsünüz. Dolayısıyla bu da bize istediğimiz başarmamızın yollarını açıyor :)

class Program
{
    static void Main(string[] args)
    {
        dynamic d = new ExpandoObject();
        IDictionary<stringobject> members = d as IDictionary<stringobject>;
        members.Add("Foo""foo");
        members.Add("Bar", 4);

        Console.WriteLine("Foo=" + d.Foo);
        Console.WriteLine("Bar=" + d.Bar.ToString());
    }
}

Tabi yukarıda dictionary içerisine eklediğimiz alanların dinamik olarak bir yerlerden geldiğini(mesela databaseden yada bir API'dan) düşünmenizde fayda var :) Bu kullanım bahsettiğim gibi dinamik object içerisinde bulunacak olan alanların dışarıdan belirlendiği senaryolarda oldukça anlamlı ve kullanılabilir. Ufak ama lazım olduğunda hayat kurtaran bir nokta :)



Visual Studio 14 CTP 3'de Yeni Neler Var ?

Visual Studio'nun 2013'den sonraki sürümü olacak olan Visual Studio 14'ün 3. CTP sürümü 18 Ağustos'da yayınlandı. Daha önceki yazımızda CTP 1 ve CTP 2'de yeni nelerin geldiğini incelemiştik. Bu yazımızda da 3. CTP ile Visual Studio 14 içerisine neler eklendiğini inceleyeceğiz.

Visual Studio 14 CTP sürümlerini nasıl indiririm ve nasıl test ederim diyorsanız daha önce yazmış olduğum yazımı okuyabilirsiniz.

.NET Framework vNext

.NET Framework'ün bir sonraki versiyonu,  CTP 3 ile beraber Visual Studio 14 içerisine eklendi. .NET Framework vNext'in en önemli parçalarından olan .NET Native ve RjuJIT de Visual Studio 14 CTP içerisine entegre edildi. Ancak bu ürünlerin hala daha alpha sürümlerinde olduklarını unutmamak lazım.

ASP.NET vNext

Visual Studio 14 CTP 3 içerisinde ASP.NET vNext runtime'ının güncellenmiş alpha 3 paketleri bulunuyor. Ayrıca CTP 3 ile beraber ASP.NET vNext tooling support'u geliştirilmiş ve unit test desteği eklenmiş. Daha detaylı bilgi için Web Development Tools bloguna bakabilirsiniz.

Custom Window Layoutların Roam Edilmesi

Visual Studio CTP 2 ile beraber Window layoutlarını kaydedip, kaydettiğimiz layoutları istediğimiz zaman tek tıklamayla aktif hale getirip Visual Studio'nun görünümünü düzenleyebiliyorduk. CTP 3 ile beraber artık bu layoutlar roam ediliyor yani Visual Studio'ya login olduğunuz hesabınız altında saklanıyor ve başka makinalarda aynı accountunuzu kullanırsanız kaydettiğiniz layoutlara erişebiliyoruz.

PerfTips

Visual Studio 14 CTP 3 içerisinde belki de en dikkat çekici yenilik PerfTips. PerfTips size breakpoint koyduğunuz noktalarda debugging yaparken yapılan işlemlerin ne kadar sürdüğünü gösteriyor.

Perftip

C# 6.0

C# 6.0 tarafında da Visual Studio 14 CTP 3 içerisde yenilikler mevcut. En önemli yenilik ise Nameof Expressionlar.

Şimdilik CTP 3 tarafında gözüme çarpan yenilikler bunlar. Bir sonraki CTP yazımızda görüşmek üzere :)



.NET Native

2015 yılında .NET Framework vNext ile beraber adını daha sık duymaya başlayacağımız projelerden biri de .NET Native projesi. .NET Native projesi ile amaçlanan C# ile geliştirdiğimiz .NET Framework uygulamalarına C++ ile yazılmış uygulama performansı ve kaynak kullanımı avantajlarını getirmek. Bunu yaparken de developerların elinden sahip oldukları güzellikleri, avantajları almamak.

En Başa Dönersek...

.NET Framework'ü target eden uygulamalar derlendiğinde arka planda IL(Intermediate Language) kodu oluşturulur. Çalışma esnasında da bu oluşturulan IL kodu JIT(Just-In-Time) Compiler'ı tarafında native koda çevrilir. .NET Native projesi de en basit anlamda yazdığınız kodun derlenirken IL'e değilde doğrudan native koda çevrilmesini sağlıyor.

Avantajlar Neler ?

.NET Native'in getirdiği en büyük 3 avantaj uygulamaların daha hızlı açılması, daha hızlı çalışması ve daha optimize memory kullanması. Şimdiye kadar yapılan ölçümlere göre de .NET Native ile beraber Windows Store uygulamaları %60 oranında daha hızlı açılmakta ve %25 oranında da daha az memory kullanmakta.

.NET Native'in getirdiği bir diğer büyük avantaj da .NET Native ile derlenen uygulamanın çalışacağı makinada .NET Framework'ün kurulu olma zorunluluğunun olmaması. Çünkü derleme sırasında .NET Native uygulama içerisinde .NET Framework'te kullandığınız kısımları alıp uygulamanızın native kodu içerisine ekliyor ve böylece .NET Framework bağımlılığından da kurtuluyorsunuz.

C++ tarafinda sahip olduğumuz yukarıdaki avantajlara gördüğünüz gibi .NET Native ile C# tarafinda da sahip olabiliyoruz. Üstelik exception handling, memory management ve garbage collection gibi C++'da bizim düşünmemiz gereken noktalardan da yine soyutlanmış olarak  C# ve .NET Framework'ün getirdiği avantajları da kullanmaya devam edebiliyoruz.

Nasıl Deneriz ?

.NET Native, Visual Studio 14 CTP 3 ile Visual Studio 14 içerisine eklendi. Ancak .NET Native compilerı default olarak aktif değil. Bizim manuel olarak .NET Native compilerını aktifleştirmemiz gerekiyor. Bunun için ilk olarak Windows Store projemizin olduğu solution'ın properties'inden "Active Config"'i Any CPU'dan çıkarıp belirli bir mimariye(x86, x64 veya ARM) çekmemiz gerekiyor.

Active Config Değiştirme

Sonrasında ise Windows Store projesine sağ tıklayıp "Enable for .NET Native"  seçeneğine tıklıyoruz. Bu işlemle birlikte projemiz içerisine default.rd.xml dosyası ekleniyor. Bu dosya içerisinde .NET Native'in kullandığı runtime directive'ler bulunuyor. Ayrıca yine bu aşamada projemiz .NET Native compilerı tarafından analiz edilerek projenin .NET Native compilerı kullanmaya uygun olup olmadığı denetleniyor ve bir rapor çıkarılıyor.

Enable .NET Native Compiler

Son adımda ise artık projenin .NET Native app olarak derlenebilmesi için Windows Store projesine sağ tıklayarak projenin properties'ine gidiyoruz ve Build sekmesini açıyoruz. Build özellikleri içerisindeki "Compile with .NET Native tool chain" seçeneğini seçtikten sonra artık uygulamamız .NET Native compilerı tarafından derlenebilir duruma geliyor.

Enable :Net Native tool chain

Sorular sorular...

Bu yazıyı okuduktan sonra eminim ki aklınıza bazı sorular takılacaktır. Aşağıda aklınıza takılabilecek soruları tahmin edip cevaplamaya çalıştım :)

Soru : .NET Native sadece C# mı destekleyecek ?

.NET Native şuan sadece C#'ı destekliyor. Ancak ilerleyen zamanlarda RTM olmadan VB'de desteklenecektir.

Soru : .NET Native ile sadece Windows Store uygulamalarını mı derleyebiliyoruz ? WPF gibi desktop uygulamalarını derlemek mümkün mü ?

.NET Native'in temel çıkış noktası Windows Store uygulamaları. Universal App'ler de .NET Native tarafından desteklenmekte. Kişisel düşüncem .NET Native'in sadece Windows Store ve Windows Phone uygulamalarını destekleyerek ilk versiyona çıkacağı. Her ne kadar desktop ve server uygulamaları için de çok sayıda talep alsalar da ilk aşamada bu talebi karşılamayacaklarını düşünüyorum.

Soru : .NET Native ile derlenen uygulamalarda reflection kullanabiliyor muyuz ? 

.NET Native uygulamalarında reflection kullanmak mümkün. Ancak reflection için gereken metadataların büyük bir kısmı proje derlenirken compiler tarafından daha optimize bir kod yaratmak amacıyla siliniyor. Bu yüzden metadatasını kullanacağınız tipler için ek olarak default.rd.xml dosyasında tanımlama yapmak gerekiyor. Reflection konusu .NET Native tarafında ilginç bir konu. Bunun için ayrı bir makale yazmayı planlıyorum. :)



XML Serializer ve Memory Problemi

Yazılım geliştirirken kullandığımız kütüphanelerin sadece kullanımlarını değil aynı zamanda implementasyon detaylarını da iyice araştırmamız ve öğrenmemiz gerek. Aksi takdirde hiç beklenmedik yerlerde hiç beklenmedik sonuçlarla karşılaşmak mümkün.

Bu yazımızda konumuz, dışarıdan oldukça masum görünen ancak içerisinde bir şeytan yatan XmlSerializer tipi :) XmlSerializer tipi bildiğiniz üzere .NET Framework içerisinde XML serialize ve deserialize işlemleri için kullandığımız bir tip. Kullanımı da oldukça basit. Örneğin, aşağıdaki koda baktığınızda Foo tipini bir MemoryStream içerisine serialize ettiğimizi göreceksiniz.

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 500000; i++)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Foo),
new XmlRootAttribute("Test"));
                Foo foo = new Foo()
                {
                    Bar = "bar"
                };
                serializer.Serialize(ms, foo);
            }
        }
    }
}

public class Foo
{
    public string Bar { getset; }
}

XmlSerializer'ın şeytanlığı onunla yaptığınız işlemin sayısı arttıkça ortaya çıktığından dolayı serialize işlemini 500.000 kez tekrarladım. Uygulamayı çalıştırıp, uygulamanın kullandığı memory miktarına baktığımda hiç beklenmedik bir sonuçla karşılaşıyoruz. Yazdığımız kod oldukça basit bir kod olmasına rağmen uygulamanın kullandığı memory daha 500000. iterasyona gelmeden 1,7 GB'a kadar çıkmakta ve uygulamamız OutOfMemoryException vermekte.

Uygulamanın kullandığı memory

Şimdi gelelim sorunun kaynağına. XmlSerializer tipi serialize ve deserialize işlemleri sırasında performansı arttırma amacıyla sizin serialize ettiğiniz her tip için arka planda dinamik olarak bir assembly oluşturuyor. Performansı arttırmak için yapılan bu hareket gördüğünüz üzere doğru kullanılmadığı durumlarda başımıza iş açabiliyor. MSDN'e göre eğer XmlSerializer'ın XmlSerializer.XmlSerializer(Type) ve XmlSerializer.XmlSerializer(Type, String) constructorlarını kullanırsanız .NET Framework arka planda yarattığı assemblyleri cache'liyor ve her XmlSerializer yarattığınızda tekrardan bir assembly yaratmıyor. Bu şekilde bir kullanım yaparsak bakalım uygulamamızın memorysi ne durumda oluyor. Yeni durumda kodumuz aşağıdaki gibi değişecek.

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 500000; i++)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Foo));
                Foo foo = new Foo()
                {
                    Bar = "bar"
                };
                serializer.Serialize(ms, foo);
            }
        }
    }
}
[XmlRoot(ElementName = "Test")]
public class Foo
{
    public string Bar { getset; }
}

Uygulamayı çalıştırdığımızda karşılaştığımız sonuçla bir önceki durumda karşılaştığımız sonuç arasında dağlar kadar fark var.

Yeni durumda memory durumu

Gördüğünüz gibi yeni durumda uygulamanın kullandığı memory 5.5 MB'a kadar düştü. Nerede 1.7 GB  nerede 5.5 MB :) Hem de çok ufak bir optimizasyonla.

Diyelim ki XmlSerializer'ın yukarıdaki optimize edilmiş contructorlarınızı kullanamıyorsunuz ve mecburen arka planda cache'leme yapmayan versiyonlarını kullanıyorsunuz. Yukarıdaki gibi memory problemi yaşamamak için önerilen yöntem yarattığınız XmlSerializer instancelarını sizin cachelemeniz. Yani burada .NET Framework'ün yapmadığını sizin yapmanız gerekiyor.

Gördüğünüz gibi yazılım geliştirirken ufak detaylar bazen oldukça önemli olabiliyor ve sizi büyük dertlerden kurtarıyor. Bu yüzden kullandığımız tiplerin, programlama dillerinin detaylarına olabildiğimiz kadar hakim olmakta fayda var. Hakimiyeti arttırmanın yolları da bol bol MSDN'i okumak ve Reflector'la kod detaylarına bakmaktan geçiyor :)



Build 2014'de İkinci Gün - Roslyn Preview, Open Source ve Fazlası

Build konferansında ikinci gün keynote'u da sona erdi. İkinci gün ilk güne nazaran oldukça sönüktü diyebilirim.

Ama şikayetlerden önce güzel haberlerle başlayalım.

Yeni Roslyn Previewleri

Roslyn projesinden eğer takip ediyorsanız 1 yıldan fazla bir zamandır bu projeden pek ses çıkmıyordu. Ancak compilerların yazımının tamamlanmasıyla beraber bugün Anders Hejlsberg 2 yeni preview'ı izleyenlere duyurdu. Bu previewler,

  • Roslyn End User Preview :  C# ve VB'nin yeni versiyonlarında olması planlanan özellikler ile bir sonraki Visual Studio versiyonuyla beraber IDE içerisine eklenecek olan özellikler bu paket içerisinde bulunuyor. Roslyn ile beraber neler geliyor, programlama dili versiyonlarında neler olacak gibi soruların cevaplarını merak ediyorsanız end user preview'ı indirip hemen test edebilirsiniz. End user preview Visual Studio Extension'ı olduğu için istediğiniz zaman kolay bir şekilde end user preview'ı visual studiodan kaldırabilirsiniz. End User Preview'ı buradan indirebilirsiniz.
  • Roslyn SDK Preview : Eğer C# ve VB compilerlarını içerisindeki API'ları kullanarak yazılan bir kodu analiz eden uygulamalar yazmak veya Visual Studio içerisinde çeşitli refactoring araçları geliştirmek isterseniz Roslyn SDK'ini kullanabilirsiniz. Roslyn SDK Preview'ı da buradan indirebilirsiniz.
Ayrıca gördüğüm kadarıyla Microsoft, Roslyn ismi yerine .NET Compiler Platform ismini kullanmayı düşünüyor. İlerleyen zamanlarda Roslyn isminin ürün isminden çıkarıldığını görebiliriz.

ROSLYN OPEN SOURCE !

Roslyn projesiyle beraber developerlardan gelen en büyük isteklerden biri Roslyn source code'unun open source olmasıydı. Microsoft developerların sesine kulak verdi ve Roslyn open source oldu. Keynote'daki en güzel anlarından biri de şüphesiz ki Anders Hejlsberg'in Roslyn'nin source code'unu sahnede CodeProject'e koymasıydı.

Roslyn projesi artık http://roslyn.codeplex.com/ burada. Source code'u  da tamamen açık. Sizde kaynak kodu indirip isterseniz kendi dil featurelarınızı geliştirip Microsoft'a gönderebilirsiniz. Ama baştan söyliyim bu işler çok da kolay değil :)

C# 6.0

Roslyn End User Preview'ı indirirseniz içerisinde Microsoft'un C#'in ve VB'nin bir sonraki versiyonlarında programlama dillerine eklemeyi düşündüğü özellikleri göreceksiniz. Bu özelliklerin bir  listesine buradan ulaşabilirsiniz.

C# 6.0 ile gelen yenilikler ilgili yazmış olduğum yazıya buradan erişebilirsiniz.

.NET Foundation

Microsoft'un son zamanlarda open souce tarafına bakış açısı ortada. Şu anda pek çok Microsoft'un development ürünü(Entity Framework, ASP.NET vb..) open source durumda. Dün de hatırlarsanız WinJS'in open source olduğunu duyurmuştum. Bugünse Roslyn compilerı open source oldu. .NET Foundation ise developerların open source Microsoft teknolojilerine hızlı bir şekilde ulaşabilecekleri ve katkıda bulunabilecekleri bir platform. Microsoft burada Xamarin ve sektördeki bazı ortaklarıyla iş birliği de yapıyor. .NET Foundation sayfasına buradan erişebilirsiniz.

Windows Azure Haberleri

Build'de ikinci gün aslında heyecanla Azure tarafındaki gelişmeleri bekliyorduk. Ancak ne yazık pek de fazla yeni haber duyma şansımız olmadı. Keynote'un genelinde Azure tarafında daha önceden duyurulan yeniliklerin demosu yapıldı. Ama yine de daha önceden duymadığımız bazı güzel yenilikler de var.

Yeni Azure Management Portali

Azure tarafındaki bana göre en heyecan verici duyuru yeni Azure management portaliydi. Yeni portal biraz Windows 8 içindeki start screen'i bize anımsatıyor.

Portale giriş yaptığınızda karşınıza gelen ekrandan pek çok metriğe aynı anda ulaşabiliyorsunuz. Ayrıca bir sayfa açmak istediğinizde sayfalar dashboard'un yan tarafında sırayla açılıyor. Böylece her  açtığınız sayfa bir önceki sayfanın yanında açılıyor. Böylece hem bir anda istediğiniz birden fazla sayfaya bakabiliyorsunuz hem de odak noktanızı kaçırmıyorsunuz.

Şu an yeni portalde eski portaldeki yapabildiklerinizin hepsini yapamıyorsunuz. Bu yüzden bir süre hem yeni hem de eski portal yan yana gidecek. Yeni portal'e https://portal.azure.com/ adresinden ulaşabilirsiniz.

Diğer Azure Haberleri

Azure'la ilgili gelen yeniliklerin ve yapılan duyuruların hepsine detaylı olarak değinemeyeceğim. Ancak aklımda kalan yenilikler şunlar,
  • Azure Web Sites'a Java Desteği
  • Azure Scheduler GA
  • Autoscaling GA
  • 500 GB SQL Azure Database desteği.
  • Read-Access Geographically Redundant Storage GA.

Visual Studio Online GA

Visual Studio Online'da Build konferansının ikinci günü itibariyle artık preview mode'dan çıktı. Eğer gerek takım çalışması için gerekse build server vs.. olarak servisi ücretsiz kullanıyorsanız ücretsiz kullanım 6 Mayıs'tan sonra sonra eriyor. Fiyatlandırma için ise buradan bilgi alabilirsiniz.

Sıkıcı Geçen Son Saat

Build'de ikinci keynote'unun sonunda geçen sene olduğu gibi yine  Steven "Guggs" Guggenheimer and John "Shew" Shewchuk vardı. Developer Conversations başlıklı konuşma yine geçen sene olduğu gibi oldukça sıkıcıydı. Developerlara Microsoft partnerlarının yaptıkları uygulamaları göstermekle neyi amaçladıklarını ne yazık ki 2 senedir anlamış değilim.

Ayrıca WPF, Micro Framework, Windows Embedded gibi teknolojilerinde Microsoft tarafında ölmediğini belirtip bu teknolojilerle ilgili Microsoft tarafında ne yapıldığından 2 senedir bahsetmemeleri de oldukça garip bir durum oldu. Bu teknolojilere Microsoft'un önem verdiğini Microsoft partnerlarının uygulamaları üzerinden developerlara mesaj vermeye çalışmaları oldukça başarısızdı bana göre. Zaten twitterda da keynote'un son saatiyle ilgili oldukça sert yorumlar vardı. Umarım gelecek sene bu ikili build konferansında sahnede olmaz :)

Build'de 3. gün keynote yok. Artık yavaş yavaş konferansın sonuna geliyoruz. Bu saatten sonrada yeni bir haber çıkacağınız zannetmiyorum :) Zaten yeteri kadar makale yazılacak konu da çıktı :)

O zaman Build dönüşü görüşmek üzere :)



Build 2014 1.Gün'de Neler Oldu

Merakla bekledigimiz Build 2014 konferansinda 1. gün sona erdi. Açikca itiraf etmem gerekirse keynote ile beraber bugün beklentilerimin oldukça üzerine çikti. Keynote'un 3 saat olacagi açiklandiginda aklimda o kadar süre nasil oturacagiz sorusu vardi açikcasi. Ancak keynote o kadar güzel planlanmisti ki açikcasi 3 saatin nasil geçtigini anlamadim.

Gelelim birinci günün gelismelerine. Anlatacak çok seyimiz var...

Not : Yazinin giris kismi Windows Phone 8.1 ve Windows 8.1 Update ile gelen son kullanici yeniliklerini içeriyor. Eger son kullanici yenilikleri beni ilgilendirmez developer yenilikleri neler diyorsaniz buradan developer haberlerine ziplayabilirsiniz :)

Windows Phone 8.1

Build konferansinda herkesin bekledigi ilk duyuru hiç süphesiz ki Windows Phone 8.1'in duyurusuydu. Nitekim keynote Windows Phone 8.1'in duyurusuyla basladi. Windows Phone 8.1 ile beraber gelen pek çok güzel özellik var. Ayrica Windows Phone 8'de olan bazi eksikliklerde bu versiyonla beraber giderilmis.

Cortana Personal Assistant

Microsoft'un uzun süredir üzerinde çalistigini bildigimiz personal assistant'i Cortana'yi sonunda görebilme sansimiz oldu. Cortana'nin en büyük rakibi malumunuz Apple tarafindaki Siri. Ancak gördügüm kadariyla Cortana su an kadar Siri'den oldukça önde.

Cortana ile yapabileceklerinizin açikcasi ucu bucagi yok :) Hemen bir örnek vermem gerekirse sesli olarak hava durumunu sorup istediginiz yerin hava durumunu hemen görebiliyorsunuz.

Ya da diyelim ki bugün hangi toplantilariniz var görmek istiyorsunuz. Hemen Cortana'ya sorup ögrenebilirsiniz.

Cortana açikcasi sizin telefonunuzdaki sekreteriniz :) Istediginiz her seyi ona sorabilir, istediginiz seyleri zamani geldiginde ondan size hatirlatmasini istiyebilirsiniz. Hatta bazi seyleri siz söylemeden onun yapmasini da saglayabilirsiniz. Bunun için Cortana'nin bir not defteri var :) Not defterine ilgi duydugunuz alanlari yazarsaniz Cortana düzenli olarak ilgi duydugunuz alanlari takip edip size gerektigi zaman ilgili uyarilari yapabiliyor. Beni en çok etkileyen demo Cortana'nin telefondaki mailleri tarayarak mail içerisindeki uçus bilgilerini bulmasi ve uçusla ilgili detaylari takip etmesi oldu.

Cortana su anda Beta durumda ve Türkçe'yi desteklemiyor. Ne zaman desteklenmeye baslar konusunu ise allah bilir :)

Notification Center

Windows Phone 8.1 ile beraber tipki IPhone ve Android'de oldugu gibi bir notification center'in gelecegi konusuluyordu. Nitekim haberler dogru çikti ve notification center'in Windows Phone 8.1 ile beraber gelecegi açiklandi.

Özellestirilebilir Lock Screen

Itiraf etmem gerekirse Windows Phone 8.1 ile beraber gelen ve beni en çok etkileyen özellik bu :) Daha önceki Windows Phone versiyonlarinda uygulamalar kendi resimlerini lock screen'e background image olarak koyabiliyordu. Ancak Windows Phone 8.1 ile beraber lock screen üzerindeki yazilarin ve lock screen açilis animasyonlarinin da özellestirilmesinin önü açilmis. Gördügüm 2 demoda da daha çok güzel tasarimlar vardi. Ilerleyen zamanlarda çok daha yaratici tasarimlarin çikacagina eminim.

Start Screen'de Daha Fazla Tile

Daha önce 5 inch'den büyük ekranlarda kullanilabilecegi duyurulan orta büyüklükteki 3 tile'in sigabilecegi start screen görünümü Windows Phone 8.1 ile beraber artik tüm Windows Phone'larda kullanilabilir durumda olacak. Windows Phone'larda bu görünümü açmak için settinglerden ilgili ayari enable etmek yeterli olacak.

Degisen Calendar Uygulamasi

Windows Phone 8.1 ile beraber Calendar uygulamasi yeniden yazilmis. Yeni calendar görünümü ile beraber artik haftalik olarak planlariniza çok daha rahat bir sekilde bakabiliyorsunuz.

Storage Sense, Wifi Sense, Battery Sense Uygulamalar

Windows Phone 8.1 ile beraber 3 tane yeni uygulama geliyor. Bunlardan ilki Storage Sense. Bu uygulama ile telefonunuzun ve telefona takili olan SD Card'in hafiza durumunu görebiliyorsunuz. Bunun yaninda uygulamalarinizin SD kart üzerine kurulmasi gibi ayarlari da bu uygulama ile yapmaniz mümkün.

Wifi Sense uygulamasi ise sizi hizli bir sekilde public networklere baglayabiliyor. Normalde bir kafeye gittiginizde internete baglanmaya çalistigimizda bir web sayfasi açilir ve sözlesmeyi kabul ettigimiz belirten butona tiklamamiz istenir. Iste Wifi Sense uygulamasi bunlari dogrudan kendisi arka planda hallediyor.

Battery Saver uygulamasi ile ise telefonunuzun sarj durumunu görebiliyorsunuz. Bunun yaninda hangi uygulama daha fazla batarya kullaniyor gibi verilere de bu uygulamadan ulasabiliyorsunuz. Ayrica herkesin uzun süredir bekledigi kalan sarj yüzdesinin ekranda gözükmesi özelligide en sonunda Windows Phone 8.1 ile geliyor.

Word Flow Keyboard Shape Writing

Windows Phone 8.1 ile beraber klavyeden elimizi kaldirmadan hizli bir sekilde yazi yazmamizi saglayan shape writing özelligi geliyor. Bu yeni klavye ile  beraber Windows Phone, en hizli mesaj yazma konusunda birinciligi Samsung Galaxy S4'den devralmis.

Windows Phone 8.1 çok daha fazlasi...

Yukaridaki özellikler Windows Phone 8.1 ile beraber gelen en dikkat çekici özellikler.  Windows Phone 8.1 ile beraber gelen daha pek çok güzel yenilik var. Windows Phone son kullanicilara yaz aylarinda sunulmaya baslanacak. Daha fazla detay için resmi blogdaki yaziyi okuyabilirsiniz.

Windows 8.1 Update

Günün ikinci beklenen haberi ise Windows 8.1'e çikacak olan ve özellikle mouse ve keyboard kullanan kullanicilara yönelik olan update'di. Bu update ile beraber mouse ve keyboard kullanan Windows kullanicilarin sikinti çektigi konulara çesitli çözümler üretilmeye çalisilmis.

Windows 8 çiktiginda beri mouse ve keyboard kullanan kullanicilarin ekranin sag tarafindaki charmlarla arasinin iyi olmadigi bilinen bir gerçek :) Bu yüzden bu update ile beraber start screen'in sag üst kösesine power ve search butonlari ekleniyor. Böylece artik ekrann sag alt kismina gidip charmi açip bilgisayari kapatmak zorunda kalmayacagiz :)

Windows 8.1 Update'i ile beraber artik Windows Store uygulamalarini da taskbar'a pinliyebiliyoruz. Tipki eski tip desktop uygulamalarinda oldugu gibi.

Windows 8.1 Update ile artik start screen biraz daha keyboard ve mouse kullanicilarini sevebilecegi hale geliyor :) Artik herhangi bir tile'a sag tikladigimizda aliskin oldugumuz bir context menü görecegiz. Ayrica Ctrl'ye basili tutup birden fazla tile'i ayni anda seçebilmemizde mümkün.

Windows 8.1 Update su an MSDN üzerinden indirilebiliyor. 8 Nisan itibariyle tüm Windows 8 kullanicilari update'i Windows Update üzerinden ücretsiz olarak alabilecekler.

Windows 8.1 Update Sonrasi...

Build konferansinda konusulmasi beklenen konulardan biri de açikcasi Windows 9'du. En azindan Windows 9 ile ilgili olarak ufak tefek detaylar paylasilir diyorduk ancak bunun yerine Windows 8.1 Update'den sonra yeni bir update'in daha gelecegi duyuruldu. Bu update ile beraber eskiden alistigimiz start menü geri dönüyor.  Oturumda gösterilen tasarimin ise final sürümde degismesini umuyorum. Çünkü start menü içerisine tile koymak hiç olmamis :) Ayrica yine gelecegi bahsedilen update ile artik windows store uygulamalari desktop üzerinde bir pencere içerisinde çalisabilecek.

9 Inch Altindaki Cihazlara Windows Artik Ücretsiz

Ilk günün en çok dikkat çeken duyurularindan biri de Microsoft'un Windows'u ve Windows Phone 8.1'i 9 inch ve altindaki cihazlar için ücretsiz yapmasiydi. Microsoft bu sekilde bir stratejiyle pazardan daha fazla pay almayi hedefliyor.

Nokia Lumia 930, Nokia 630 ve Nokia 635

Windows Phone 8.1'in duyurulmasindan sonra sira telefonlar tarafina dolayisiyla da Nokia'ya geldi. Nokia'nin Windows Phone 8.1'li ilk telefonlari Lumia 930, 630 ve 635 olacak. Amerika disinda satisa sunulacak olan Lumia 930'un tasarimi hosuma gitti açikcasi. Özellikleri de oldukça iyi.

Nokia Lumia 635 ise Nokia'nin ilk dual sim özelligini destekleyen telefonu olacak.

Diger Gelismeler

Build'in birinci gününde yukaridaki konulardan ayri olarak üzerinde durulan diger konular touch tabanli office uygulamalari ve Kinect For Windows V2'di.

Developer Dünyasindan Haberler

Son kullanici dünyasindan haberler bu kadar. Simdi gelelim esas biz developerlari ilgilendiren haberlere.

Visual Studio 2013 Update 2 RC

Visual Studio 2013 Update 2 bugün itibariyle RC (Release Candidate) oldu. Ancak Beta versiyonunda olmayip RC sürümünde update içerisine eklenen pek çok sey var. Yazinin ilerleyen kisimlarinda eklenen kisimlara deginecegiz. Visual Studio 2013 Update 2'yi buradan indirebilirsiniz.

Windows Phone 8.1 SDK

Windows Phone 8.1 duyurulmasiyla Windows Phone 8.1 SDK RC sürümü developerlara sunuldu. Eger Visual Studio 2013 Update 2 RC'yi bilgisayariniza kurarsaniz Windows Phone 8.1 SDK'in de bilgisayariniza yüklendigini göreceksiniz.

Universal Windows  Apps

Developerlar açisinda birinci gün keynote'un en ilgi çekici konusu bence kesinlikle Universal Windows Apps. Her developerin rüyasidir tek bir kod yazip, yazdigi kodu farkli platformlarda çalistirmak. Su ana kadar portable class libraries ile bir nebze Windows ve Windows Phone uygulamalari için belirli bir miktar kodu paylastirabiliyorduk. Ancak aradaki uçurum çok fazlaydi.

Windows Phone 8.1'de telefonun altindaki runtime artik Windows Runtime. Yani su an Windows Store app yazarken kullandigimiz runtime ile ayni. Verilen rakamlara göre % 90 oraninda API'lar birbirleri ile ayni.

Universal Windows Apps konseptinde ise yapilmak istenen proje içerisinde shared bir alan içerisinde kodunuzu ve viewlerinizi tutarak windows ve windows phone applerinizin bu ortak kodlari kullanmasini saglamak. Viewlarda bulunan kontroller ise bulunduklari platforma uygun bir sekilde render ediliyor. Eger paylasilan alanda bulunan viewlari platform spesifik olarak degistirmek isterseniz de ilgili view'i platforma ait olan projeye sürükleyip orada özellestirmeniz mümkün.

Konunun bu sekilde çok havada kaldigini farkindayim :) Konferans dönüsü ne kisa zamanda bu konuyla ilgili detayli bir yazmayi düsünüyorum.

Typescript 1.0

Bugün itibariyle Typescript 1.0 versiyonu release oldu. Visual Studio Update 2 RC içerisinde Typescript'in 1.0 versiyonu bulunuyor. Detayli bilgiye buradan ulasabilirsiniz.

Cross Platform ve Open Source WinJS

Windows Store uygulama gelistirirken HTML & JS tarafindan ilerleyenlerin kullandigi javascript librarysi WinJS artik cross platform oldu ve webde çalisabilecek hale getirilerek open source olarak açildi. Detayli bilgiye buradan erisebilirsiniz.

.NET Native Preview

Build'in ilk günü keynote'da bahsedilmeden sessiz sedasiz duyurulan ve bana göre biraz da gölgede kalmis olan .NET Native,  C# ile yazilan Windows Store uygulamalarinin dogrudan makina dilinde derlenmesini sagliyor. Böylece kod yazarken ve debugging yaparken C#'in getirdigi kolayliklari kullanabilirken performans olarak da C++'in avantajlarina sahip olabiliyoruz. Bu konuyla ilgili de Build dönüsü bir yazi yazmayi düsünüyorum. Simdilik buradaki yazidan detaylari okuyabilirsiniz.

Satya Nadella Sahnede !

Ilk gün keynote'un sonunda ise sahnede Microsoft'un yeni CEO'su Satya Nadella vardi. Daha önceki konferanslardan farkli olarak bu sene keynote'un sonuna kadar hep developer kökenli ve esas ürünlerden sorumlu kisilerin sunumlarini izledik. Bunlarda developer kökenli Satya Nadella'nin katkisi oldugu yadsinamaz bir gerçek.

Yarin keynote'da Azure günü :) Bakalim ne gibi yenilikler gelecek.

Benden simdilik bu kadar. Artik dinlenme vakti :)



.NET Framework'ün Source Code'una Erişim Artık Daha Kolay

Her developer öyle veya böyle kod yazdığı platformda kullandığı kütüphanelerin arkasında yazılan kodu merak eder :) Tabi en çok da uygulamasında bir bug olduğunda :)

.NET tarafındaki librarylerin source code'larına eskiden zaten erişebiliyorduk. Ancak framework versiyonları ilerledikçe source code'a eriştiğimiz kaynak framework'ün hızına yetişemedi ve zamanla eski ve kullanılamaz hale ulaştı.

.NET Framework 4.5.1 ile beraber artık .NET Reference Source sitesi yenilendi ve yeni yüzüyle developerlara açıldı. Artık çok daha hızlı bir şekilde .NET Framework source code'u içerisinde gerek web sayfası üzerinden gerekse Visual Studio üzerinde gezinebiliyoruz. Visual Studio tarafındaki detaylara geçiş yapmadan önce kısaca bir websitesine bakalım.

Siteyi ilk açtığımızda sağ tarafta site içerisinde indekslenen assemblylerin listesini görüyoruz. Eğer kodunu görmek istediğiniz tipin hangi assembly içerisinde olduğunu biliyorsanız buradan hızlı bir şekilde istediğiniz kontrole erişmeniz mümkün.

Sağdaki listeden örnek olarak mscorlib assemblysini seçersek karşımıza alternatif olarak 2 görünüm geliyor. Bunlar Project ve Namespace görünümü. Bu 2 alternatif görünümü de kullanarak aradığımız tipe ulaşmamız mümkün.

Manuel olarak ilerlemek yerine adını bildiğiniz tipe search yaparak da erişebilirsiniz. Böylece assembly ve namespaceler ile uğraşmadan doğrudan istediğiniz tipin koduna erişebilirsiniz. Örneğin diyelim ki System.Collections.Generics namespace'i içerisindeki List<T> tipinin kodunu bulmak istedik. Doğrudan searche List<T> yazmamız yeterli. Böylece çok daha hızlı bir şekilde istediğimiz koda erişebilmekteyiz.

Diyelim ki search veya assembly üzerinden navigasyonla istediğimiz tipi bulduk ve kodlara eriştik. Kodlar üzerinde de gezinmemiz oldukça kolay. Tıpkı Visual Studio'da olduğu gibi herhangi bir metodun üzerine tıklarsanız doğrudan o metodun koduna erişebilirsiniz.

Web sitesindeki kod üzerinde yaptığınız her gezintide site url'inin değiştiğini göreceksiniz. Site url'i üzerinde sizin o anda gezindiğiniz kod dosyası ve satır numarası saklanıyor. Böylece eğer arkadaşınıza "Bak List<T> tipi içerisinde şöyle bir şey buldum" :) demek isterseniz göndereceğiniz link arkadaşınızı doğrudan ilgili kod satırına yönlendirecektir.

http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs#241

Visual Studio Üzerinden .NET Framework Koduna Erişim

Diyelim ki yazdığınız uygulamayı debug ediyorsunuz ve debug ederken de .NET Framework içerisindeki kodu da debug etme ihtiyacınız doğdu. Bunun için şuradaki ayarları Visual Studio üzerinden yapmanız gerekiyor. Eğer tüm bu ayarlarla uğraşmak istemiyorsanız Visual C# MVP'si Schabse Laks'ın geliştirdiği Ref12 extension'ını kurabilirsiniz. (Extension Visual Studio 2010 ve üzerini destekliyor.)

Extension'ı yükledikten sonra kodunu görmek istediğiniz tipin üzerine gelip Go To Definition'a tıklarsanız doğrudan ilgili tipin koduna navige olabiliyorsunuz.

Eğer tüm .NET Framework'ün source code'unu indirmek isterseniz doğrudan buradaki linki kullanabilirsiniz. Visual Studio kullanarak kod üzerinde gezmek eminim daha iyi hissetirecektir sizi :)

Herşey ROSLYN Sayesinde Daha Kolay !

Tüm bu sistem nasıl yapıldı ? Bu kadar data nasıl elde edildi ? diye merak ediyor olabilirsiniz. :)

Bu sistemin arka planında Roslyn var. Roslyn sayesinde framework kodu derlenirken site içerisinde gördüğünüz herşey alınıp ayrı bir veri saklama alanına konuluyor. Sonrasında da alınan datalar üzerinde search özelliği siteye ekleniyor ve görmüş olduğunuz site çıkmış oluyor. Aslında buna benzer siteyi Roslyn kullanarak kendi kodlarınız içinde yapmanız mümkün. Diyelim ki şirket olarak bir SDK yazıyorsunuz ve SDK içinde bir developer portal yapıp SDK içerisindeki classları ve metotların açıklamalarını koyacaksınız. İşte Roslyn kullanmak için süper bir sebep :)

Roslyn ile ilgili yakında daha çok şey duymaya başlayacağız. Ancak şimdilik benim verebileceğim bilgiler bu kadar. :) Nisan ayında BUILD konferansından sonra daha rahat bir şekilde konuşabileceğimi tahmin ediyorum  ;)



C# Fundamentals - Generic Tiplerin Olmadığı Bir Dünya

Blogu açtığım ilk günden itibaren aldığım feedbacklerden biri neden giriş seviyesinde birşeyler yazmıyorsun eleştirisiydi :) Artık gelen taleplere daha fazla direnmeyerek C# Fundamentals serisi başlatıyorum :) Bu video serisinde C#'ın ilk versiyonundan bugünkü versiyonuna kadar getirilen yenilikleri sıfırdan anlatamaya çalışacağım.

Serinin ilk videosu C# içerisindeki Generic  typelara giriş niteliğinde. Bundan uzun yıllar önce, C# 1.0 zamanlarında, generic typelar olmadan nasıl kod yazıyorduk konusuna değindik bu videomuzda.

Sonraki videomuzda da generic tipler nasıl kullanılır konusuna değineceğiz.

İyi Seyirler



Immutable Collections

Bir önceki yazimizda Immutable Nesnelerden bahsetmistik ve gerekli durumlarda kendi Immutable nesnelerimizi nasil yazabilecegimizi görmüstük. Yine ayni yazinin sonlarinda hatirlarsaniz Immutable Collectionlardan kisaca bahsetmistim.

Bu yazimizda ise Immutable Collectionlari biraz daha detayli bir sekilde inceleyecegiz.

Immutable Collectionlar da aslinda baktigimizda Immutable Nesne mantiginin collectionlar üzerinde implemente edilmis hali. Basit olarak siz bir Immutable Collection yaratirken collection içerisinde bulunacak olan elemanlari veriyorsunuz ve sonrasinda bu collection içerisinde bir degisiklik yapamiyorsunuz. Eger bir Immutable Collection içerisine eleman eklemek veya silmek isterseniz yani collectionin state'ini degistirmek isterseniz de bu state'i tasiyacak olan yeni bir collection yaratmak zorundasiniz. Böylece elinizde bulunan collectionin thread-safe oldugunu garanti altina almis oluyorsunuz. Çünkü elinizdeki collectiona isteginiz kadar thread ayni anda ulassin collection üzerinde bir degisiklik yapmalari mümkün degil.

Simdi gelelim Immutable Collections'i nasil kullanacagiz konusuna...

Microsoft Immutable Collections Nuget Package

Uygulamalarinizda yukarida bahsettigim Immutable Collectionlari kullanmak isterseniz Microsoft tarafindan gelistirilen Immutable Collections Nuget paketini kullanabilirsiniz. Bu paketi projenize eklemeniz için asagidaki komutu yazmaniz yeterli.

PM> Install-Package Microsoft.Bcl.Immutable

Yukaridaki komutu yazip projemiz içerisine Immutable Collection nuget paketi ekledikten sonra Immutable Collectionlari System.Collections.Immutable namespace'i içerisinde bulabiliriz.

System.Collections.Immutable namespace'i içerisindeki tiplere baktigimizda aslinda hepsi bizim günlük development hayatimizda oldukça hasir nesir oldugumuz tipler. Peki bu tiplerin Immutable versiyonlarinda ne gibi bir kullanim farklari var ?

ImmutableList<T>

class Program
{
    static void Main(string[] args)
    {
        ImmutableList<int> integerList = ImmutableList.Create(1, 2, 3, 4, 5);
        ImmutableList<int> newIntegerList = integerList.Add(6);
        Console.WriteLine("Integer List Count:{0}",integerList.Count);
        Console.WriteLine("New Integer List Count:{0}", newIntegerList.Count);
    }
}

Yukaridaki  koda baktigimizda aslinda dikkatimizi çeken 2 önemli nokta var. Bunlardan ilki ImmutableList'i yaratmak için kullandigimiz Create metodu. Create metodunu kullanmamizin ana sebebi Immutable List'i ilk yaratirken efficient bir sekilde sadece 1 kere yaratilmasini saglamak. Yani arka planda sadece 1 collection yaratip sonrasinda da parametre olarak geçtigimiz elemanlari eklemek.

Yukaridaki koddaki bir diger önemli nokta da ImmutableList'in içerisindeki Add metodunun yeni bir ImmutableList döndürmesi. Yani siz elinizdeki ImmutableList içerisine eleman eklemek isterseniz arka planda size otomatik olarak yeni bir collection yaratiliyor ve verdiginiz eleman bu yeni collection içerisine ekleniyor. Ayni durum eleman çikarma veya insert operasyonlari için de geçerli. Peki yukaridaki kodu çalistirirsak nasil bir çiktiyla karsilasiriz ?

ImmutableStack<T>

Immutable Collectionlar içerisinde ilgi çeken tiplerden biri de ImmutableStack tipi. Bu tipi kullanarak Immutable bir sekilde stack yapisi kurabiliyorsunuz.

Örnek olarak,

class Program
{
    static void Main(string[] args)
    {
        ImmutableStack<string> stack = ImmutableStack.Create("Bir""Iki");
        string element = String.Empty;
        var newStack = stack.Pop(out element);
        Console.WriteLine("Element={0}", element);
        Console.WriteLine("Stack Count={0}", stack.Count());
        Console.WriteLine("newStack Count={0}", newStack.Count());
    }
}

Yukarida gördügünüz gibi hizli bir sekilde Immutable bir stack yaratabiliyoruz ve stack içerisindeki Pop metodunu kullanarak en yukaridaki elemani out parameteresi ile elde edebiliyoruz. Out parametresiyle en üstteki elemani alirken ayni zamanda en üstteki elemanin artik içerisinde bulunmadigi yeni bir ImmutableStack nesnesi de metottan geri dönüyor. Yukaridaki kodu çalistirirsak asagidaki sonucu görürüz.

Immutable Collections Mutlaka Bilinmesi Gerekenler

Yukaridaki bölümlerde Immutable Collectionlarin temel çalisma yapisini gördük. Simdi sira geldi Immutable Collectionlarla çalisirken mutlaka bilmemiz gereken noktalara.

  1. Immutable Collectionlarla ilgili bilmemiz gereken en önemli sey Immutable Collectionlari gerektigi zaman ve yerinde kullanmak. Çünkü Immutable Collection kullanmak her zaman diger generic collectionlari kullanmaktan daha iyidir diye birsey yok. Örnegin, diyelim ki bir kütüphane gelistiriyoruz ve kütüphane metotlarindan döndürdügümüz collectionlarin thread-safe olmasini ve içeriginin degistirilemediginden emin olmak istiyoruz. Burada Immutable Collectionlari kullanmak oldukça mantikli ve isimizi kolaylastirmakta. Ancak metot sonucunda Immutable Collection döndürecegiz diye library içerisindeki her yerde Immutable Collection kullanmak dogru degil. Unutmayin ki collectionin durumunu degistirmek istediginizde arka planda yeni bir collection yaratiliyor.
  2. Diyelim ki kütüphaneniz içerisinde kendi ihtiyaçlariniz dogrultusunda generic collectionlari kullandiniz ve artik elinizde bir List<T> tipinden bir  collection var. Bu collectioni otomatik olarak Immutable karsiligina çevirmek için extension metotlari kullanabilirsiniz. (Not : Extension metotlari kullanabilmek için System.Collection.Immutable namespace'ini eklemeniz gerekiyor.)
    using System;
    using System.Collections.Generic;
    using System.Collections.Immutable;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ImmutableCollections
    {
        classProgram
        {
            staticvoid Main(string[] args)
            {
                List<int> integerList = newList<int>();
                ImmutableList<int> immutableList = integerList.ToImmutableList();
                Dictionary<stringstring> dictionary = newDictionary<stringstring>();
                ImmutableDictionary<stringstring> immutableDictionary = dictionary.ToImmutableDictionary();
            }
        }
    }
  3. Eger içerisinde eleman bulunan bir Immutable Collection yaratmak isterseniz ya extension metotlari kullanin ya da Create veya CreateRange metotlarini kullanin. Böylece istediginiz Immutable Collectiondan sadece tek instance yaratmis olursunuz. Örnek olarak asagida farkli 2  kod örnegi bulunmakta. Bunlardan ilki etkin ve daha performansli olarak yeni bir Immutable Collection yaratirken, digeri daha düsük performansli olmakta ve gereksiz yere Immutable Collectionlar yaratmakta. Dogru Kullanim
    classProgram
    {
        staticvoid Main(string[] args)
        {
            ImmutableList<int> immutableIntegerList = ImmutableList.Create(1, 2, 3);
            List<int> integerList = newList<int>() { 1, 2, 4 };
            immutableIntegerList = ImmutableList.CreateRange(integerList);
        }
    }
    Yanlis
    classProgram
    {
        staticvoid Main(string[] args)
        {
            ImmutableList<int> immutableIntegerList = ImmutableList<int>.Empty;
            immutableIntegerList = immutableIntegerList.Add(1);
            immutableIntegerList = immutableIntegerList.Add(2);
            immutableIntegerList = immutableIntegerList.Add(3);
            List<int> integerList = newList<int>() { 1, 2, 4 };
            immutableIntegerList = ImmutableList<int>.Empty;
            foreach (int item in integerList)
            {
                immutableIntegerList = immutableIntegerList.Add(item);
            }
        }
    }
  4. Eger içerisinde hiç eleman bulunmayan Immutable Collectionlar yaratmak isterseniz ilgili class üzerindeki Emptypropertysinden içi bos bir Immutable Collection alabilirsiniz.
    classProgram
    {
        staticvoid Main(string[] args)
        {
            ImmutableList<int> emptyList = ImmutableList<int>.Empty;
            ImmutableDictionary<stringstring> emptyDictionary = ImmutableDictionary<stringstring>.Empty;
            ImmutableQueue<string> emptyQueue = ImmutableQueue<string>.Empty;
        }
    }
  5. Son olarak da Immutable Collectionlarin normal generic collectionlara nazaran daha yavas çalistigini unutmayin. Yavas çalismalarin temel nedeni aslinda implemente edilme sekilleri.  Daha detayli bilgi için burayave buraya bakabilirsiniz.

Immutable Collections'in Gelecegi(Immutable Array)

Immutable Collections paketi release olmadan önce içerisinde ImmutableArray tipini de barindiriyordu. Ancak release olma sürecinde Immutable Array implementasyonu ile ilgili design ve performans sorunlari çikinca bu tip paket içerisinde çikarildi ve bir sonraki versiyona birakildi. Bu nedenle Immutable Collections'in bir sonraki versiyonunda ImmutableArray tipi library içerisine ekleniyor olacak.

Immutable Collectionlar ile ilgili bir yazi yazmak uzun süredir aklimdaydi ancak yeni gerçeklestirebildim. :) Umarim faydali olmustur.