İlkay İlknur

just a developer...

C# 6.0 Webiner Kaydı

Daha önce planlaması için anket paylaştığım C# 6.0 webinerini gerçekleştirdik. Webiner sırasında C#'in geleceğinden, Roslyn compilerlarından ve C# 6.0 ile beraber gelecek olan özelliklerden bahsettik.

Webiner içerisinde değindiğim tüm özellikler şu an preview durumda. Bu nedenle ilerleyen dönemlerde Microsoft'un bu özelliklerde değişiklik yapması da oldukça doğal. Bu yüzden webineri izlerken bu noktayı aklımızın bir köşesinden tutmakta fayda var.

İyi Seyirler :)



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. :)



C# 6.0 - Nameof Expressions

Başlamadan : Aşağıda inceleyeceğimiz özellik Visual Studio 14 CTP 3 ile gelen bir özelliktir. Visual Studio 14 CTP nasıl kurulur ve aşağıdaki gibi özellikleri denemek için ne yapmak gerekir  gibi soruların cevaplarını linklerde bulabilirsiniz.

Visual Studio 14 CTP 3 ile beraber C# içerisine implemente edilmiş olan özelliklerden biri de nameof expressionlar. Bazı durumlarda kod içerisinde kullandığımız değişkenlerin metotların isimlerini string olarak yazma gereği duyarız. Örneğin, bir metoda gelen parametrelerden biri null ise ArgumentNullException içerisinde gelen parametrenin adını yazarız.

void Foo(Bar bar)
{
    if(bar==null)
    {
        throw new ArgumentNullException("bar");
    }
}

Bir diğer  örnek senaryo da INotifyPropertyChanged interface'inin implementasyonu.

class Bar : INotifyPropertyChanged
{
    private int foo;

    public int Foo
    {
        get { return foo; }
        set
        {
            foo = value;
            PropertyChanged(thisnew PropertyChangedEventArgs("Foo"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Bunlara benzer kullanımlarda karşımıza çıkan en büyük sorunlardan biri de string olarak adını yazdığımız değişkenin veya metodun adını değiştirmek. Bu değişikliği yaptığımızda değişkenin adını string olarak yazdığımız için Visual Studio isim değiştirme sırasında haliyle string olarak yazılan kısmı değiştirmiyor. Örneğin, ArgumentNullException fırlattığımız örnekte metoda gelen parametrenin adını değiştirirsek aşağıdaki gibi bir durumla karşılaşırız.

Parametre adı değiştirme

Gördüğünüz gibi metoda gelen parametrenin adını değiştirdik ancak throw new ArgumentNullException("bar") kodu değişmedi. Bu durumda da bizim yazdığımız kodun içerisinde fırlatılan exception'ın içerisinde parametrenin adı eski adıyla kaldı. Böyle değişikler yaptığımız durumlarda string olarak değişkenin, metodun veya herhangi bir elemanın adını yazmak yerine C# 6.0 ile beraber gelecek olan nameof expression'ı kullanarak elemanın ismini yazma işini compilera bırakıyoruz.

void Foo(Bar bar)
{
    if (bar == null)
    {
        throw new ArgumentNullException(nameof(bar));
    }
}
INotifyPropertyChanged interface'inin nameof expression ile implemente edilmiş hali şu şekilde olacak.
class Bar : INotifyPropertyChanged
{
    private int foo;

    public int Foo
    {
        get { return foo; }
        set
        {
            foo = value;
            PropertyChanged(thisnew PropertyChangedEventArgs(nameof(Foo));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Nameof expression kullanarak elemanların isimlerini alırsak bu elemanların isimlerinde değişiklik yaptığımızda da Visual Studio bize yardımcı olacak ve nameof expression'ın içerisindeki elemanın adını da değiştirecektir.

Parametre adı değiştirme nameof Peki arka planda neler oluyor derseniz, compiler yazdığınız kodu derlerken nameof expression gördüğü yerlerde verdiğiniz elemanın adını hardcode ediyor ve string olarak yazıyor. Nameof expressionlar her ne kadar ufak bir yenilik gibi gözükse de biz developerların hatalı kod yazmasını önlemesi nedeniyle bence önemli ve güzel bir yenilik olmuş.


Visual Studio 14 CTP 1 ve 2'de Neler Var ?

Yine geldik bir Visual Studio VNext yazısına daha :) Visual Studio'nun 2013'ten sonraki versiyonunun kod adı 14. Yani Visual Studio 14.  Buradaki 14 tabi yılı temsil etmiyor :) Sadece kod adı. Visual Studio 14 kod adlı ürünün 2015 yılı içerisinde RTM olması bekleniyor.

Haziran ayında ilk CTP sürümü gelen Visual Studio 14'ün Temmuz ayında da 2. CTP sürümü geldi. Bu yazımızda da bu 2 CTP sürümünde neler geliyor diye bakacağız. Ama öncelikle Visual Studio 14 CTP'yi nasıl indirebiliriz bir bakalım. Eğer başka yazılarımda nasıl kurulacağını okuduysanız aşağıdaki bölümü atlayabilirsiniz.

Visual Studio 14 CTP Kurulum

Microsoft, Visual Studio 14 CTP için şu anda production ortamında kullanım desteği vermiyorAyrıca Visual Studio 14'ün önceki Visual Studio versiyonlarıyla beraber yan yana(side by side) çalışma durumuda şu an için yok. Bu yüzden önerim Visual Studio 14'ü kesinlikle günlük development yaptığınız makinaya kurmamanız. Bilgisayarınızda bir VM açıp oraya kurabilirsiniz. Güncel Visual Studio 14 CTP versiyonunu da buradan bulup download edebilirsiniz. Ama "Yok ben VM ile uğraşmak istemiyorum.  2 saat Windows kur zor iş..." diyorsanız ve Windows Azure hesabınız(Eğer MSDN hesabınız varsa MSDN hesabınızla beraber içerisinde belirli bir kotaya kadar kullanma limiti olan bir Azure hesabı da geliyor.) da varsa çok süper bir fırsat sizi bekliyor. Azure'da Visual Studio 14 CTP yüklü bir VM :)Azure'da Visual Studio 14 CTP yüklü bir VM'i nasıl yaratacağınızı aşağıda görebilirsiniz.

Roslyn Compilerları

Visual Studio 14 ile beraber Roslyn compilerları artık eski compilerlarla yer değiştiriyor. Yani yeni Visual Studio 14 ile derlediğiniz projeler artık Roslyn compilerları ile derlenecek. Haliyle Visual Studio 14 CTP içerisinde C# 6.0 ile gelen yenilikleri de herhangi bir plugin vs.. kurmadan kullanabilirsiniz. Hatta Visual Studio 14 CTP içerisinde yeni bir C# 6.0 özelliği daha bulunuyor. Null propagating operator (?.)

Roslyn İle Yeni Refactoring Araçları

Roslyn compilerlarının Visual Studio içerisine eklenmesiyle refactoring toollarında da bazı güzel yenilikler var. Zaten Roslyn projesinin en öncelikli amaçlarından biri de bu şekilde refactoring araçlarının yazılmasını kolaylaştırmak. Visual Studio 14 CTP içerisindeki refactoring yeniliklerinden birini aşağıda görebilirsiniz.

ASP.NET VNext Tooling

Visual Studio 14 CTP  içerisindeki en büyük yeniliklerden biri de ASP.NET VNext toolingi. Microsoft bir sonraki ASP.NET versiyonuyla radikal değişikliklere gidiyor. Şu anda runtime'ın büyük bir kısmı yeniden yazılıyor. Bu nedenle bu yeni versiyonla ilgili toolingi de Visual Studio 14 CTP'de bulabilirsiniz.

ASP.NET VNext içerisinde neler geleceğini buradan, Visual Studio 14 içerisindeki ASP.NET VNext toolingi ile ilgili detaylı bilgiyi de burada bulabilirsiniz.

Editör Touch Desteği

Visual Studio 14 CTP 2 ile beraber editör içerisine touch desteği geldi. Eğer touch screen bilgisayarınız varsa artık editör içerisinde scrool, tap, zoom gibi gestureları kullanabilirsiniz. User Voice'te görünene göre en çok istek alan itemlardan biri ki bu özelliği yapmaya karar vermişler. Ancak ben developerların pek touch gestureları kullanarak kod yazacaklarını zannetmiyorum. Ama tabi bekleyip göreceğiz bakalım bu özelliği developerlar ne kadar benimseyecekler.

Büyük Harf Menü Başlıklarından Geri Dönüş

En çok şaşırdığım yeniliklerden biri. Visual Studio 2012 ile beraber getirdiklerinde aldıkları onca tepkiye rağmen geri adım atmamışlardı. Ancak 2 sene sonra geri adım atarak sanırım inatlarından vazgeçiyorlar :) Visual Studio 14 CTP içerisinde artık menü başlıklarının hepsi büyük harf  değil.

Visual Studio 14 CTP 1 ve 2 ile ilgili göze çarpan yenilikler şimdilik bu kadar. Yeni CTP'ler çıktıkça da blogda yenilikleri paylaşacağım. Arayüz olarak Visual Studio 2013'e göre yenilik olmadığını farketmişsinizdir. Ancak ben arayüz yeniliklerini bir konferans vs.. düzenleyerek duyuracaklarını düşünüyorum. Bu artık Build mi olur Teched mi olur ne zaman olur bilemem :) Ancak arayüzde değişiklikler olacağını biliyorum :)


Visual Studio 14 CTP'de C# 6.0 Null Propagating Operatorünü(?.) Deneyin !

Daha önce  C# 6.0  ilgili yazdığım yazılarda, C# 6.0 ile gelecek olan bazı yenilikleri aslında ekibin uzun süredir yapmayı düşündüğünü ancak eski compilerlardan dolayı yapamadığından bahsetmiştim. Bu yazımızda da yine böyle bir özellikten bahsedeceğiz. Ama öncelikle değinmem gereken bir nokta var. Gelin önce oradan başlayalım.

Visual Studio 14 CTP

Visual Studio'nun Visual Studio 2013'ten sonraki versiyonunun ilk parçaları yavaş yavaş dışarı açılmaya başlandı. Kod adı Visual Studio 14 olan ürün 2015 yılı içerisinde RTM olacak.(Bu yüzden Visual Studio 14 diye kitap yazacakları şimdiden uyarıyorum :)) Ancak yeni Visual Studio RTM olana kadar Microsoft, CTP sürümleriyle yeni Visual Studio içerisindeki özellikleri developerların testine açıyor. İlk CTP bundan 1 ay önce Haziran ayında gelmişti. Bu yazı yazıldığı zamanlarda ise 2. CTP sürümü yayınlandı.

Nasıl Yükleriz ?

Microsoft, Visual Studio 14 CTP için şu anda production ortamında kullanım desteği vermiyor. Ayrıca Visual Studio 14'ün önceki Visual Studio versiyonlarıyla beraber yan yana(side by side) çalışma durumuda şu an için yok. Bu yüzden önerim Visual Studio 14'ü kesinlikle günlük development yaptığınız makinaya kurmamanız. Bilgisayarınızda bir VM açıp oraya kurabilirsiniz. Güncel Visual Studio 14 CTP versiyonunu da buradan bulup download edebilirsiniz. Ama "Yok ben VM ile uğraşmak istemiyorum.  2 saat Windows kur zor iş..." diyorsanız ve Windows Azure hesabınız(Eğer MSDN hesabınız varsa MSDN hesabınızla beraber içerisinde belirli bir kotaya kadar kullanma limiti olan bir Azure hesabı da geliyor.) da varsa çok süper bir fırsat sizi bekliyor. Azure'da Visual Studio 14 CTP yüklü bir VM :)

Azure'da Visual Studio 14 CTP yüklü bir VM'i nasıl yaratacağınızı aşağıda görebilirsiniz.

Null Propagating Operator (?.)

Null propogating operator şu anda User Voice'de  C# içerisinde olması en çok istenen özelliklerden biri. Özet olarak bu özellikle daha az kod yazarak null kontrolü yapabiliyoruz.

Örneğin aşağıdaki koda bakarsak,

class Program
{
    static void Main(string[] args)
    {
        Customer customer = GetCustomer();
        string name = null;
        if (customer != null)
        {
            name = customer.Name;
        }
    }

    static Customer GetCustomer()
    {
        Customer customer = null;
        bool createNew = Convert.ToBoolean(new Random().Next(0, 1));
        if (createNew)
        {
            customer = new Customer()
            {
                Id = 1,
                Name = "ilkay"
            };
        }
        return customer;
    }
}
public class Customer
{
    public int Id { getset; }
    public string Name { getset; }
}

Yukarıdaki koddaki Main metodu içerisindeki kullanıma bakarsanız GetCustomer metodundan dönen Customer'ın Name propertysini alabilmemiz için null kontrolü yapmamız gerekti. Bu yapmamızın temel nedeni de GetCustomer metodunun her zaman bir Customer nesnesi dönmemesi. Yani duruma göre Customer nesnesi duruma göre de null dönmesi. Tabi ki yukarıdaki durumun normalde karşınıza çıkması çok da olası değil. Yani kimse random olarak bir metotdan nesne dönme durumunu yaratmaz eğer deli değilse :) O yüzden yukarıdaki durumu database'den data çektiğiniz ve verdiğiniz filtreye göre de kaydın DB'de olma veya olmama durumu olarak düşünebilirsiniz.

Esas konumuza geri dönersek, yukarıdaki durumlarda bir nesnenin belirli propertylerine ulaşmak istediğimizde null kontrolü yapmamız kodumuzun güvenli bir şekilde çalışması için zorunlu. Hal böyle olunca bu şekilde kontrollerin gerektiği her yerde yukarıdaki gibi if statementları yazmak durumunda kalıyoruz ve bu da kodumuzun hem biraz kirli gözükmesine neden oluyor hem de bizler developer olarak biraz daha fazla kod yazıyoruz.

Peki null propagating operator ne getiriyor ? derseniz, null propogating operator ile bir property'e veya metoda erişirken null kontrollerini bir operator kullanarak yapmanızı sağlıyor ve böylece fazladan if yazmaktan kurtuluyorsunuz. Bu operatör ile ilgili gerçek düşüncelerimi paylaşmadan önce gelin bu operatörü nasıl kullanacağımıza bakalım.

Visual Studio 14 CTP'de Ufak Bir Ayar

Bu özelliği Visual Studio 14 CTP'de kullanabilmek için ufak bir ayar yapmak gerekiyor. İlk olarak test için bir proje yarattıktan sonra projenin .csproj uzantılı proje dosyasını açıp içerisine <LangVersion>Experimental</LangVersion> tagini eklemek gerek. Bu ayarın tam olarak nasıl yapılacağını aşağıda görebilirsiniz.

Yukarıdaki ayarı da yaptıktan sonra gelelim bu operatörü nasıl kullanacağımıza. Yukarıda bahsettiğim null propagating operatorü ?. 'dır. Yani null olması muhtemel olan bir nesnenin herhangi bir property veya metoduna erişmek istediğinizde bu erişimi . kullanarak değilde ?. kullanarak yaparsanız null kontrolünü otomatik olarak yapmış olursunuz. Null propagating operatörünü kullanarak yukarıda yazdığımız Main metodunu şu şekilde yazabiliyoruz.

static void Main(string[] args)
{
    Customer customer = GetCustomer();
    string name = customer ?.Name;
}

Gördüğünüz gibi kullanımı oldukça basit ve sizi if kontrolü yapmaktan kurtarıyor. Kontrol sırasında eğer customer null ise Name propertysine erişilmeden null değeri name değişkenine atanıyor. Eğer customer null değilsede customer nesnesi içerisindeki Name propertysindeki değer name değişkenine aktarılıyor.

Güzel ve Tehlikeli Taraflar

Gelelim bu özelliğin güzel ve tehlikeli taraflarına. Öncelikle belirtmem gerekirse bu özellik %90 oranında C# 6.0'da olacak. Yani Microsoft her ne kadar biz şu anda bu özelliği experimental olarak yaptık dese de bence bu özellik çok yüksek bir ihtimalle yeni versiyonda gelecek. Bir karar verip biz bunu yapmaktan vazgeçtik derlerse büyük süpriz olur. Bu özelliğin tahmin edeceğiniz üzere güzel tarafı bizim daha az kod yazamamızı sağlaması. Ancak tabi içerisinde bazı tehlikelerde barındırıyor. Öncelikli olarak en büyük korkum 1-2 sene sonra aşağıdaki gibi kodlar görmek :)
string a = b?.c?.d?.e();
Her ne kadar bu kadar da olmaz desek de bunlar olacak. O yüzden ben bu özelliğin oldukça fazla suyunun çıkarılacağını, kodun okunulabilirliğinin ve bakımının da oldukça düşeceğini düşünüyorum. Bu yüzden de zamanında C# 6.0 planlamasında bu özellikle ilgili olumsuz oy kullanmıştım :)  Siz ne dersiniz ? Var mı beni bu düşüncemden vazgeçirecek kimse :)