C# 8’e Bakış
C# 8 hakkında yazmadan önce beni en çok etkileyen kısımdan başlamak istedim. Arayüzlerin (Interface) bu değişimi ve nasıl kullanılacağı konusunda ekip içerisinden tartışmalarımız da olmuştu. Artısıyla eksisiyle çok ilgi çekecek bir konu olarak karşımızda olacağını düşünüyorum.
C# 8 hakkında yazmadan önce beni en çok etkileyen kısımdan başlamak istedim. Arayüzlerin (Interface) bu değişimi ve nasıl kullanılacağı konusunda ekip içerisinden tartışmalarımız da olmuştu. Artısıyla eksisiyle çok ilgi çekecek bir konu olarak karşımızda olacağını düşünüyorum. Bunun dışında Java 9 ve C# 8 versiyonlarının incelerken bu dillere fonksiyonel dillerde olan özelliklerin aktarılmaya çalışıldığını görüyorum. Java Scalayı baz alırken C# ise F# baz alıyor diyebiliriz.
Default Interface Implementations
Aslında bu arayüzlerde body kullanımı Java’ya Java 9 ile birlikte gelmişti. Şimdi de C# 8. versiyonuyla .Net te karşımıza çıkıyor.
Arayüzlere yeni yöntemler ekleme arayüzdeki yeni yöntemin arayüzü uygulayan tüm nesnelerde uygulanmasını gerektirir. Buda arayüze eklenen yöntemlerin her sınıfta bağımsız olarak uygulanması demektir ki bu gerçekten de çok can sıkıcı bir iştir..
Varsayılan arayüzler (Default Interface) ise arayüzdeki mevcut yöntemlerin bir fonksiyonu olarak uygulandığı sürece sınıfların etkilenmeden kullanılmasını sağlar. Aşağıdaki CreditManager arayüzünü ele alarak bunu bir örnekle daha iyi açıklayabiliriz.
1 2 3 4 5 6 7 8 |
public interface ICreditManager { void TakeCredit(decimal totalAmount,decimal interestRate ,int installment); } |
Yukarıda örnekte olduğu gibi krediler üzerine bir işlem yapmak istediğimiz de bu arayüzü kullanarak bunu diğer arayüz ve sınıflara uygulayabiliriz. Bu genel olarak kullandığınız varsayılan kullanım şeklimizdir. Şimdi aşağıdaki örneğe bakacak olursak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public interface ICreditManager { void TakeCredit(decimal totalAmount,decimal interestRate ,int installment); void TakeCardCredit(decimal totalAmount, decimal interestRate, int installment) { installment = installment > 12 ? 8 : installment; TakeCredit(totalAmount, interestRate * 0.01, installment); } void TakePhoneCredit(decimal totalAmount, decimal interestRate, int installment) { TakeCredit(totalAmount, interestRate * 0.05, installment); } } |
Kredi alma işlemi arayüz üzerinden genişletilmeye gidilmiştir. Bu belki istenen bir yöntem olmamak ile birlikte ileride varacağız yer için bize kolaylık sağlayan bir durum oluşturmaktadır.
Örnekten de anlayacağınız gibi diğer sınıfları ve arayüzleri etkilemeden bir genişleme sağlamış olduk.
Non-Nullable & Nullable Reference Types
C # iki değişken türü vardır: temel(primitives) ve başvuru (reference ) türleridir. int, char ve double gibi. Bu türler null değerini alamaz. Bir değer atamadan yeni bir int oluştururken null yerine 0 değeri olan bir int elde edilir. C # 2.0 ile , “?” olarak gösterilen çeşitli ilkellerin null versiyonlarını getirdi. Yani int? null bir değer alabilir oldu.
C# 8 de ise bunun için bir yöntem geliştirilmeye başladı. Detayını takip etmek isteyenler buraya bakabilirler.
1 2 3 4 5 6 7 |
string strDemoNotNull = "demo"; //non-nullable reference type string? strDemoNull = null; //nullable reference type Console.Write(strDemoNotNull); |
New Lightweight Classes: Records
Kayıtlar (Records) olarak adlandırılan bu özellik C# ta sınıf yaratmanın yeni bir yoludur. POCO türü nesneleri hızlı bir şekilde oluşturmaya amaçlanmıştır.Nesneler arasındaki eşitliğin kıyaslanmasında önemli bir sorunu çözerler. Kullanım şeklini aşağıda görebilirsiniz.
1 2 3 4 5 |
class UserAccount(int Id, string Name, string Surname, int Age) |
Sonuç olarak NET alanındaki geliştirmeler hızlı bir şekilde ilerliyor. Diğer makalelerimizde de incelediğimiz C#7 geliştirmeleri ve C# 8 üzerindeki geliştirmelerin gerçekte iyi olduğu bir gerçektir. Yukarıda da bahsettiğim gibi C# fonksiyonel dillerin güzel özelliklerinide kendi üstüne taşımaktadır.
Görüşmek üzere..