1. Ana Sayfa
  2. C#
  3. C# 9.0 ile Gelen Yenilikler

C# 9.0 ile Gelen Yenilikler

c#

Bu makalemde .NET 5’in desteklediği C# 9.0 ile bizlere sunulan bazı yeni özelliklere değinmek istiyorum.

Top – Level Statements

Top – level statements özelliği, artık basit bir console uygulamasını bir class ve Main method’u kullanmadan kodumuzu daha sade bir şekilde yazmamızı sağlıyor. Aynı şekilde uygulama içinde asenkron kod çağırmak, argümanlara erişmek ve local function bildirmek mümkündür.

Resim – 1

Örnek olarak programlamaya yeni başlayan herkesin aşina olduğu Hello World’ü aşağıdaki gibi yazabiliriz.

Resim – 2

Target – typed New Expressions

C#’ın önceki versiyonlarında bir sınıftan nesne oluştururken constructor’ı çağırmadan önce nesnenin tipini belirtmemiz gerekiyordu. C# 9.0 ile birlikte ifadenin sol tarafında nesnenin tipi belli ise sağ tarafta tekrar nesne tipi belirlememize ihtiyaç kalmıyor.
Örneğin;

Resim – 3

Target-typed new expressions özelliği ile bu şekilde ifadenin sağ tarafında yukarıdaki gibi Dictionary sınıfını tekrar belirtmemize gerek kalmıyor:

Resim – 4  

Ayrıca bu durum, nesnenin tipi ifadenin sol tarafında belirlendiğinden dolayı bu özelliği var keyword’ü ile birlikte kullanamayacağımız anlamına geliyor.

Target – typed Conditional Expression

Tek satırda if – else yazmamıza olanak sağlayan Ternary Operator( ?: ) için yeni bir özellik getirildi. C#’ın önceki sürümlerinde Ternary Operator’u kullanırken “?” ve “:” sonrasında gelen ifadelerin tipleri aynı olmalıydı. C# 9.0 ile eğer tipler arasında ortak bir tip söz konusu yada implicit conversion mümkün ise arka planda convert işlemi yapılıyor ve herhangi bir derleme hatası almıyoruz.

Örneğin, C# 8.0 için aşağıdaki ifadede casting işlemi yapmadığımız sürece hata alıyoruz.

Resim – 5

Init – Only Setters

C# 9.0 sayesinde tanıştığımız init keyword’ü ile object initialization sırasında property’e değer ataması yapabiliyoruz. Ancak init ile tanımlanan bir property’nin değerini ilk atamadan sonra değiştirememiz mümkün değildir. Init kullanımına aşağıdaki gibi bir örnek verebiliriz.

Resim – 6

Person objesini initialize ettikten sonra init olarak bildirdiğimiz “Id” özelliği için tekrar değer ataması yapmayı denediğimizde aşağıdaki hatayla karşılaşıyoruz.

Resim – 7

Records

C# 9.0, bizlere init keyword’ü ile bir property’i immutable (değişmez) yapabilmeyi sağlarken bir objeyi immutable yapmak istediğimiz durumlarda ise record’ları kullanmamızı mümkün kıldı. Record olarak tanımlanan bir nesne value type(değer tip) gibi davranır. Bildiğiniz üzere değer tipler değerleri tutar, böylece değer tipler metotlara aktarıldığında orijinal verilerin bir kopyasında değişiklikler yapılır. Örnek olarak aşağıdaki gibi bir record tanımlayabiliriz.

Resim – 8

Record olarak tanımlanan bir nesnede değişiklik yapmak istediğimizde with ifadesini kullanabiliriz. With ile nesnemizi kopyalayabilir, istediğimiz özelliği değiştirebiliriz. Buna aşağıdaki gibi bir örnek verebiliriz.

Resim – 9

Ayrıca Record’lar için inheritance desteği, record object comparison yani iki nesnenin referans ve değer olarak karşılaştırılması özelliği ve positional record’larda constructor / deconstructor kullanımına izin verilmesi gibi kullanışlı özellikler de mevcuttur.

Lambda Discard Parameters

Discard ( _ ), ihtiyaç duymadığımız değişkenlerin bellekte gereksiz yere yer kaplamaması için geliştirilmiş bir özelliktir. Bellek optimizasyonunu hedefleyen bu özelliği, C# 9.0 ile birlikte Lambda ifadelerinde parametre olarak kullanabilmekteyiz.

Bu özellik için aşağıdaki gibi bir kullanım örneği verebiliriz.

Resim – 10

Covariant Returns

C# 9.0’dan önce bir base class’tan yeni bir class türettiğimizde, base class içerisinde bulunan abstract yada virtual metotları override etmemiz mümkündü fakat bu metodun dönüş tipini değiştirmemiz mümkün değildi.  C# 9.0’da artık ana sınıfta bildirilen başlangıç türünün bir kovaryant tipini döndürebiliyoruz. Örneğin, artık üst sınıftan miras alınan bir tipi döndürebiliriz.

Resim – 11

Extending Partial Methods

C#’ın önceki sürümlerinde partial metotlar için bazı kısıtlamalar vardı:

  1. Partial metotlar void dönüş tipine sahip olmalıdır.
  2. Partial metotlar out parametresi alamaz.
  3. Partial metotlar erişim belirliciler (accessibility keywords) ile birlikle kullanılamaz.

C# 9.0, bu kısıtlamaları kaldırmayı amaçlıyor. Aşağıdaki kod parçasını bu kullanıma örnek olarak verebiliriz.

Resim – 12

Patern Matching Improvements

Kısaca, bir nesnenin belirli kriterlere uyup uymadığını kontrol etmek olarak tanımlayabileceğimiz Pattern Matching işlemi için C# 9.0’da bazı geliştirmeler yapıldı.

  • Relational Patterns

Sadece “=” operatörüyle kullanılabilen switch ifadesi  artık “<”,”>”, “<=” ve “>=” operatörleri ile de kullanabiliyoruz.

  • Logical Patterns

C# 9.0, “and” , “or” ve “not” gibi mantıksal operatörleri Pattern Matching için kullanma imkanı sunuyor. Ayrıca Relational Patterns ile birleştirilebilmesi oldukça kullanışlı gözüküyor.
Relational ve logical pattern’ların bir arada kullanılmasına aşağıdaki gibi bir örnek verebiliriz.

Resim – 13

  • Not Pattern

“not” mantıksal operatörü ayrıca if statement içerisinde is ile birlikte kullanılabiliyoruz.
Örnek olarak aşağıdaki gibi bir if statement yazmak mümkündür.

Resim – 14

  • Simple Type Pattern

Type Pattern bir değişkenin belirli bir tipte olup olmadığını kontrol etmemizi sağlayan desen olmakla birlikte bunun C# 9.0’daki karşılığı Simple Type Pattern’dir. Simple Type Pattern sayesinde, Type Pattern ile yapılan tip bildirimlerinden sonra değişken adı tanımlamak veya discard (_) kullanma kullanma zorunluluğu ortadan kalktı.
Örneğin aşağıdaki switch – case ifadesini;

Resim – 15

C# 9.0 ile birlikte değişken adı tanımlamadan yazabiliriz.

Resim – 16

C# 9.0 ile birlikte gelen yeni özelliklerin bir kısmından kısaca bahsetmeye çalıştım. Diğer tüm özelliklere şu linkten ulaşabilirsiniz: https://github.com/dotnet/roslyn/blob/master/docs/Language%20Feature%20Status.md

Faydalı olması dileğiyle. 😊

Bu konuyla ilgili sorularınızı https://forum.mshowto.org linkini kullanarak ulaşacağınız forum sayfamızda sorabilirsiniz.

Referanslar:

http://www.mshowto.org

https://github.com/dotnet/csharplang/tree/master/proposals/csharp-9.0

https://docs.microsoft.com/tr-tr/dotnet/csharp/whats-new/csharp-9

https://anthonygiretti.com/tag/c-9/

Tags: ,

Yorum Yap

Yazar Hakkında

2019 yılında Yıldız Teknik Üniversitesi Matematik Mühendisliği bölümünden mezun oldum. Stajlarımı Ziraat Teknoloji ve Halkbank BT’de tamamladım. Lisans eğitimim ve yaptığım stajlar yazılım alanına yönlenmemi sağladı. Şu an 360 Dotnet’te Junior Software Developer olarak çalışıyorum ve C#, JavaScript, WinForms, WPF, ASP.NET MVC, MSSQL Server, Microsoft Azure konularında kendimi geliştirmeye devam ediyorum.

Yorum Yap