İlkay İlknur

just a developer...

C# 7.1 Yenilikleri

Bu makaleye Github üzerinden katkıda bulunabilirsiniz.

Daha önceki blog yazılarımda ve videolarımda C#'ın minor releaselerinin çıkarılması için çalışmalar yapıldığından bahsetmiştim. Şimdiye kadar baktığımızda her yeni Visual Studio versiyonu ile beraber C#'ın da yeni versiyonu çıkıyordu. Bu nedenle hem büyük kapsamlı yenilikler hem de ufak yenilikler doğrudan tek bir versiyon içerisinde bulunuyordu. Halbuki dil içerisindeki bazı yenilikler geliştirilmesi bitse bile yeni versiyon çıkana kadar biz developerlarla buluşamıyordu.

İşte C# 7.1, bu noktada C#'ın ilk minor release'i olmakta. Visual Studio 2017 kullananlar için 15.3 versiyonu ile beraber gelirken, .NET Core'da ise 2.0 SDK'i ile beraber geliyor. Ancak bu versiyonları edinseniz bile C# 7.1 yenilikleri otomatik olarak kapalı geliyor. Bu nedenle ayrıca açmak için ufak bir ayar yapmaya ihtiyacımız var. Bunun için projemize sağ tıklayıp, Properties seçeneğini seçiyoruz ve sonra da çıkan ekrandan Build tabına geçiyoruz. En altta bir Advanced butonu olacak ve o butona tıkladığımızda ise şöyle bir ekran karşımıza gelecek.

Gördüğünüz gibi Language Version olarak latest major versiyon seçili. Yani default olarak C# 7.0 kullanılıyor. Language version seçeneklerini açtığımızda ise şu şekilde bir liste ile karşılaşıyoruz.

Buradan eğer "latest minor version" seçeneğini seçersek projede artık release olan tüm C# minor versiyonlar updateler geldikçe otomatik olarak kullanımda olacaktır. Bunları yapmak yerine belirli C# versiyonunu seçip projede hep o versiyonun kullanılmasını da sağlayabilirsiniz. Bu ayarı yaparken unutulmaması gereken bir nokta da bu ayarın build konfigürasyonu başına yapılması. Yani yaptığınız değişikliğin hem debug hem de release modda yapılmış olması gerekiyor. Eğer csproj dosyasını manuel editleyerek yapmak isterseniz bunu göz önüne almayı unutmayın. Eğer Visual Studio üzerinden yukarıdaki gibi ayar yapmak istiyorsanız da projeye sağ tıklayıp Properties'e tıkladığınızda gelen ekranda sol yukarıdaki Configuration combobox'ında All Configurations'ı seçmeyi unutmayın.

Şimdi gelelim C# 7.1 özelliklerine...

Async Main

C# 5.0 ile beraber async/await geldiğinden beri özellikle demo yaparken Main metodunun async olamaması ile ilgili hep bir istisna olduğundan bahsediyorduk. Methodu async yapamadığımız için de async bir metot çağırırken bazı farklı kullanımlarda bulunuyorduk. Artık yıllar sonra artık bu durum sona erdi ve Main metot Task veya Task<int> döndürebilir hale geldi. Main metot içerisinde async metotları gönül rahatlığıyla artık await edebiliriz 😃

Default Literals

C# içerisinde bir tipin default değerini alabilmek için default expressionları kullanabiliyorduk.

Örneğin,

var x = default(string);
var y = default(Func<stringintList<string>>); // <---- :(

Sadece string gibi tiplerin default değerini alırken yazım olarak çok zorlanmasak da özellikle kompleks generic tipler olduğunda onları yazmak bazen zor olabiliyordu. Yukarıda verdiğim ikinci örnek bu zorluğa ufak bir örnek olabilir. C# 7.1 ile beraber compiler tipini tahmin edebilidiği durumlarda artık sizin default a ekstra bir tip vermenizi zorunlu kılmıyor. Bu nedenle doğrudan default literal'i kullanabiliyorsunuz. 1-2 kullanım yaparsak örnek olarak...

static async Task Main(string[] args)
{
    Foo(default, 12);
}

static int Foo()
{
    return default;
}

static void Foo(string k, int y)
{

}

Yukarıda görüldüğü gibi metotların alacakları parametrelerde, döndüreceği değerlerde ve daha başka pek çok noktada sadece default literalini kullanabiliriz. Burada kritik nokta compilerın default değerini alacağı tipi tahmin edebilmesi. Tahmin edemediği durumlarda zaten sizden tipi ayrıca belirtmenizi isteyecektir.

Tuple isimlendirme geliştirmeleri

C# 7.0 ile beraber gelen benim en favori özelliğim tuplelar. C# 7.1 ile beraber de tuple içerisindeki fieldların isimlendirilmesi ile ilgili ufak ama güzel bir yenilik geliyor. Tuple kullanımında tuple yaratırken fieldlara dışarıdan isim verebiliyorduk.

Örneğin,

var count = 5;
var sum = 50;
var retVal = (sum: sum, count: count);

Bu şekilde kullanımlarda tuple içerisine koyduğumuz değişkenlerin isimleriyle tuple içerisindeki fieldların ismini büyük oranda aynı oluyor. Dolayısıyla aslında bunu biz belirtmesek de compiler bunu arka planda kendisi yapsa nasıl olur 😃 C# 7.1 ile artık bu mümkün

var count = 5;
var sum = 50;
var retVal = (sum, count);

Console.WriteLine($"Count:{retVal.count} , Sum:{retVal.sum}");

Yukarıda gördüğünüz gibi tuple yaratırken içerisine verdiğimiz değişkenlerin isimleriyle aynı isimde fieldlar yaratılıyor.

Gördüğünüz gibi C# 7.1 içerisinde ufak ama günlük hayatımızda kod yazarken bize yardımcı olacak özellikler gelmekte. Bir sonraki release olacak olan 7.2 release'inde çok daha farklı yenilikler geliyor olacak. Artık bu özellikler için 2 yıl yeni Visual Studio versiyonunu beklemeye gerek yok.