.Net 6 ve Yenilikleri #3 (All Features)
.Net 6 sürümü Kasım 2021 tarihinde yayınlandı. .Net 6 ile birlikte MAUI, Entity Framework Core, Asp.Net Core gibi ekosistemin diğer ürünleri de yayınlanan sürüm ile yeni özellikler, performans iyileştirmeleri gibi konularda güncellemeler aldı. Takip edip gördüğüm önemli değişiklikleri iki farklı yazı ve Enis Necipoğlu ile gerçekleştirdiğim online etkinlik ile yorumlamaya çalıştım. Bu yazılara ve etkinliğe ulaşmak için;
bağlantılarını kullanabilirsiniz.
.Net 6 heyecanı artık geride kaldı. Kasım 2022 tarihinde yayınlanması beklenen yeni sürüm artık .Net 7. .Net 7 LTS (Long Term Support) almayacak. Bir sonraki LTS alacak sürüm 2023 yılında yayınlanacak .Net 8 olacaktır.
Bu yazıda .Net 6 ile gelen tüm özellikleri tek tek inceleyeceğiz ve anlamaya çalışacağız.
C# 10, LinQ, System.Text.Json, Api ve EF Core üzerinde olan yenilikleri ayrı başlıklar şeklinde işleyeceğiz. Hadi öğrenelim. 🥸
C# 10 ve Yenilikleri
Deconstruction
Deconstruction yani yapısızlaştırma, değişken bir değeri parçalara ayırma ve bunları yeni değişkenler halinde saklama sürecidir. Deconstruction bir tanımlama grubu gibi birden çok değeri depoladığında yararlı olabilir.
C# 9 Deconstruction
Bu sürümde deconstruction sadece initialization veya assigment yapabilir. Örnek kod üzerinden bunu görebilirsiniz.
C# 10 Deconstruction
Bu sürümde ise deconstruction hem initialization hem de assigment işlemlerini aynı anda yapabilir. Örnek kod üzerinden bunu görebilirsiniz.
Caller Experssion
C# 10, yeni bir caller expression attribute(öznitelik) sağlar.
Bir parametre için atanan bir ifadenin string olarak yakalanmasını sağlar.
Bir compiler services attribute olduğu için isteğe bağlı bir parametreye uygulayabilirsiniz.
Constant Interpolated Strings
C#’da metin tipindeki verilerin tutulduğu string değişken tipinin biçimlendirilmesi için placeholder adı verilen yapılar kullanılabilir.
C# 10 string interpolation kullanarak
const dizilerinin initialize olmasına izin verir. Tek şart placeholder
const string olmalıdır. Placeholder sayısal bir
const olamaz çünkü runtime’da string tipine dönüştürülür.
Extended Property Pattern
C# 10 nested nesnelere erişimi kolaylaştırır ve okunabilirliği artırır.Ayrıca artık daha az curly brackets var.
File Scoped Namespace
C# 10, namespace tanımlamaları için yeni bir yöntem sunuyor. Bu yeni sürümle curly brackets artık daha az kullanılıyor.
Global Usings
C# 10
using için
global anahtar kelimesi ile tüm dosyalarda ortak olarak kullanılacak yönergeleri tek bir yerde yazılmasını amaçlar.
Tek şart global using tanımlamaları normal using tanımlamalarından önce yapılmasıdır.
Parameterless Struct Constructors
Önceki C# sürümlerinde
structyapıları
field initializersdesteklenmezdi.
C# 10 ile birlikte
structyapıları için
field initializersdesteklenir. Böylece
struct ve
class arasındaki declarations farkı kapanır.
Record Sealed
Önceki C# sürümlerinde
record türünde
ToString yöntemini
override ettiğinizde onu
sealed hale getiremezdiniz.
sealed komutu ile işaretlenmiş sınıflardan kalıtım alınamaz.
sealed komutu ile işaretlenmiş metodlar
override edilemez.
C# 10 ile birlikte sınıflarda olduğu gibi
ToString yöntemini
sealed olarak işaretleyebilirsiniz.
With Expression On Any Struct Type
C# 9 ile birlikte
with expression
record türleri için tanıtılmıştı.
with belirtilen özellikler ve değiştirilmiş alanlar ile bir kopyalama işlemi gerçekleştiriyordu.
C# 10
struct türleriyle de
with ifadesini kullanabiliyoruz.
With Expression For Anonymous Types
Önceki C# sürümlerinde
with ifadesini
anonymous türlerde kullanamıyorduk.
C# 10 ile birlikte
with ifadesi
anonymous türlerde de kullanılabilir.
EF Core 6.0 ve Yenilikleri
Value Converter For Nullable Fields
Value Converter yapılarını zaten biliyoruz. Genellikle
Enum tipinde olan alanlar için kullanıyorum.
ValueConverter<TModel,TProvider> bilgileri ile çalışan ve içerisine çeşitli şartlar yazıp veriyi convert edebileceğimiz bir yapı.
EF Core 6.0 ile birlikte boş değerlerin dönüştürülmesine izin verilir.
BreedConverter içerisinde tanımlanan
convertsNulls alanı boş değerlerin dönüştürülmesine izin verir. Örnek kodda çalışan command çıktılarında da görüldüğü gibi
Breed alanı
nullable olarak işaretlenmiştir. Oluşan
Migration dosyasında da bunu görebiliyoruz.
Handling Temporary Values
EF Core 5.0 sürümünde entity üzerinde bulunan herhangi bir değer
temporary olarak işaretlendiğinde context üzerindeki herhangi bir işlemde bu değerler sıfırlanıyordu. EF Core 6.0 sürümüyle entity track edilmeden önce
temporary olarak işaretlenen alanları ayarlayabiliyoruz ve daha önceki sürümlerde olduğu gibi değerler sıfırlanmıyor.
Column Ordering For Migration
Column Ordering ile migration çalıştığında belirttiğiniz göreye göre sütünlar sıralanacaktır.
Command Source Information For Interceptor
EF Core üzerinde
Interceptor 3.x sürümlerinden itibaren hayatımızda bu sürümle
CommandSource üzerine yeni bir
enum değeri eklenerek yürütülen
command bilgisinin kaynağına ulaşabiliyoruz.
Contains Using Value Converter
Complex tiplerinizi json serialize işleminden geçirip veri tabanında sakladığımızda o alanı sorgulamak için veriyi Ram’e çekmek gerekirdi. Bu sürüm ile serialize edilmiş alanlarınızı sorgulayabilirsiniz.
Cosmos Collection of Primitive Types
Cosmos primitive collection tiplerini destekler. Bu özelliği kullanırken dikkat etmemiz gereken nokta key değerlerinin
string olma zorunluluğudur. Ayrıca collectionların içeriğini şimdilik sorgulayamıyoruz.
Cosmos FromSql
Bu sürümde Cosmos provider
FromSqlRaw metodunu destekler.
Cosmos Distinct Queries
Bu sürümde Cosmos provider basit sorgularda
Distinct yöntemini çevirebilir.
Cosmos Math Translations
Bu sürümde Cosmos provider Math/MathF yöntemlerini çevirir.
Çevrilen yöntemler;;
• Abs -> ABS
• Acos -> ACOS
• Asin -> ASIN
• Atan -> ATAN
• Atan2 -> ATAN2
• Ceiling -> CEILING
• Cos -> COS
• Exp -> EXP
• Floor -> FLOOR
• Log -> LOG
• Log10 -> LOG10
• Pow -> POWER
• Round -> ROUND
• Sign -> SIGN
• Sin -> SIN
• Sqrt -> SQRT
• Tan -> TAN
• Truncate -> TRUNC
Cosmos String Translations
Bu sürüm daha fazla string yöntemini çevirir.
Çevrilen yöntemler
• String.Length -> LENGTH
• String.ToLower -> LOWER
• String.TrimStart -> LTRIM
• String.TrimEnd -> RTRIM
• String.Trim -> TRIM
• String.ToUpper -> UPPER
• String.Substring -> SUBSTRING
• + operator -> CONCAT
• String.IndexOf -> INDEX_OF
• String.Replace -> REPLACE
• String.Equals -> STRINGEQUAL
EF Core Minimal Api
Bu sürüm kendi minumum Api’lerini barındırır. Minimal Api’de yeni extension metodları karşımıza çıkıyor. Alışık olduğumuz
AddDbContext yerine direkt provider seçimini yaparak
DbContext nesnenizi yapılandırabilirsiniz.
EF.Functions.Random
Bu sürüm ile
RAND() yöntemini kullanabiliyoruz. SQL Server, SqLite ve Cosmos için kullanılabilir.
Entity Type Configuration Attribute
Entity üzerine
EntityTypeConfigurationAttribute yerleştirerek varlıklarınıza özel configuration yazabilirsiniz. Aslında bu özellik EF Core 6.0 ile gelen yeni bir özellik değil ancak bu sürümde attribute desteği gelmiş durumda. Eski sürümlerde custom bir configuration yazdığınızda
OnModelCreating içerisinde bunu çağırmanız gerekiyordu. Bu sürümde ise
attribute yardımıyla uygun configuration bulunur ve kullanılır.
InMemory Database Validate Properties
Bu sürümde inmemory veritabanı için validationlar çalışır. İsterseniz bu doğrulamayı devre dışı bırakabilirsiniz.
Less Configuration for Many-To-Many Relationships
Many-To-Many ilişkili varlıklarınızı tanımlarken sağ ve sol ilişkileri belirtmeden varlığınızı yapılandırabilirsiniz.
Migration Bundles
Projenin büyüklüğüne göre migration dosyalarımız çok büyük olabilir.
Migration Bundle yürütülebilir bir
*.exe dosyası oluşturarak tüm migrationları tek bir noktada toplar.
CD süreçlerinde kullanabilirsiniz. .Net SDK indirmenize gerek yok. Sadece runtime olması yeterli.
Filexible SQL Server Free-Text Search
Önceki sürümlerde binary sütünlarda FreeText yöntemini kullanamıyorduk. EF Core 6.0 ile bu sorun düzeltilmiş. Konu array mapping olunca kimse bence SQL Server’dan daha iyi sonuçlara sahip olan PostgreSQL tercih etmelisiniz. Merak edenler için dökümana buradan ulaşabilirsiniz.
Precision Attribute
Özellikle
decimal alanlarda hassasiyet bazen önemli olabiliyor. Önceki sürümlerde hassasiyeti yapılandırmak için
OnModelCreating içerisinde
Fluent bir şekilde tanımlama yapıyorduk. Bu sürüm ile aramıza katılan
PrecisionAtribute ile de bunu yapabilirsiniz.
Loading Related One-To-Many Entities
Performansa etki edebilecek küçük bir iyileştirme. EF Core related nesneleri joinlerken nesnelerin birlikte gruplanması için
OrderBy cümlecikleri ekler. Yapılan incelemelerde fazladan
OrderBy cümlecikleri analiz edilmiş ve kaldırılmış.
SavePoints In SQLite
EF Core 6.0 SQLite üzerinde
savepoints yani kaydetme noktalarını destekler.
Kayıt noktalarına
rollback yapabilirsiniz.
SQLite DateOnly and TimeOnly Support
Bu sürümde SQLite provider
DateOnly ve
TimeOnly tiplerini destekler. Bu alanları
text olarak saklar.
Tag Query With File Name and Line Number
EF Core 2.2 sürümünden itibaren
debugging esnasında hayatımızı kolaylaştıracak bir özellik aramızdaydı. Query Tag. Sorgularımıza özel etiketler atayıp
debug esnasında bunları kontrol edebiliyorduk.
EF Core 6.0 sürümünde bu özellik biraz daha geliştirilmiş ve Query Tag içerisine dosya adı ve satır numarası da eklenmiş.
Translate String.Concat With Multiple Arguments
Preview 1 veya Preview 2 sürümlerinde bu özellik tanıtılmıştı.
Önceki sürümlerde
string.concat 2 bağımsız değişkenle çalışıyordu.
Bu sürümde ise 3 veya 4 değişkenle çalıştırabilirsiniz.
Translate ToString on SQLite
EF Core 5.0 sürümünde SQL Server için ToString translation eklenmişti.
EF Core 6.0 sürümünde ToString translation SQLite için de eklendi.
String olmayan sütünlarda arama yaparken işimize yarayabilir.
Translation for IsNullOrWhiteSpace
Önceki sürümlerde bir alanın boş olup olmadığını öğrenmek için bazı trimming komutları çalışıyordu.
EF Core 6.0 ile daha stabil bir sorgu generate ediliyor.
LINQ ve Yenilikleri
*By Extensions
.Net 6 yeni
Enumerable.*By yöntemleri sunuyor.
KeySelector yardımıyla bu yöntemleri kullanabilirsiniz. Aşağıdaki örnekte sadece
MaxBy ve
MinBy yöntemleri kullanılmıştır.
Chunk
Sıralanabilir bir kaynağı eşit parçalara bölmek için
Chunk kullanılabilir.
*OrDefault Improvements
*OrDefault yöntemlerinde yazılan şarta uygun bir eleman bulunmadığında default değeri override edebilirsiniz.
Desteklenen yöntemler:
• SingleOrDefault
• FirstOrDefault
• LastOrDefault
ZipLinq
Eski sürümlerde iki diziden itemlar içeren yeni bir yapı oluşturabiliyordu.
Bu sürümde dizi sayısı üç olarak güncellendi. Dört veya daha fazlası hala desteklenmemekte.
.Net 6 ve Yenilikleri
Configuration Helpers
.Net 6'da yeni bir
Configuration Helper eklendi.
GetRequiredSection ile yapılandırma esnasında eksik bir bilgi varsa hata fırlatacaktır.
Configure Host Options
Zaten yapabildiğimiz bir yapılandırıcıyı ayrı metot olarak sağlamışlar.
Create Async Scope Api
.Net 6
Async Service Scope oluşturmak için
CreateAsyncScope yöntemini sağlıyor.
Eski sürümlerde
IAsyncDisposable arayüzünden türeyen servisler
CreateScope yöntemi hata fırlatırdı. Bu noktada
CreateAsyncScope sorunumuzu çözüyor.
Eski sürümlerde geçici çözüm olarak aşağıdaki kod bloğunu kullanıyorduk.
DateOnly And TimeOnly
Uzun zamandır beklediğimiz türlerdi ve sonunda geldi. Kısaca özetlemek gerekirse
DateTime tipinin
Date ve
Time bölgelerini ayrı ayrı temsil eden tipler olarak düşünebilirsiniz.
Metrics Api
.Net 6
OpenTelemetry Metrics Api default olarak destekler.
Meter sınıfı ile gerekli enstrümanları oluşturabilirsiniz. Ayrıca
meter üzerindeki eventleri dinleyebilirsiniz.
There are instrument classes:
• Counter
• Histogram
• ObservableCounter
• ObservableGauge
Bit Operations
2'nin katlarıyla çalışırken yardımcı olması için yeni yöntemler eklenmiş.
Bu yöntemler
IsPow2 ve
RoundUpToPowerOf2
‘IsPow2’, belirtilen değerin iki katı olup olmadığını değerlendirir.
‘RoundUpToPowerOf2’, belirtilen değeri iki kata kadar yuvarlar.
Symmetric Algorithm New Methods
Payload memory üzerindeyse .Net 6 streams avoid için yeni yöntemler sunar.
• DecryptCbc
• DecryptCfb
• DecryptEcb
• EncryptCbc
• EncryptCfb
• EncryptEcb
Parallel.ForEachAsync
.Net 6'da
Parallel.ForEach nihayet eklendi.
Periodic Timer
.Net 6 fully async olarak çalışan
Periodic Timer yapısını destekler.
PriorityQueue
Bu özelliği ilk gördüğümde nedendir bilmem ama çok hoşuma gitti. 🤔
Daha önce böyle bir yapıya ihtiyacım mı oldu acaba neden bu kadar hoşuma gitti diye düşünmeye başladım ancak ne kadar düşünsemde geçmişte geliştirdiğim algoritmaların içerisine yerleştirebileceğim bir senaryo bulamadım ama eminim ileride bir gün ihtiyacım olacaktır. 🤣
Kısacası System.Collections.Generic üzerinde bulunan bu yapı ile oluşturduğunuz Queue(Kuyruk) yapılarına priority verebilirsiniz. Ayrıca dequeue gibi işlemlerde artık verdiğiniz priority bilgisine göre işlem yapılacağını belirtmekte fayda var. Normalde Queue yapıları FIFO (First In First Out) mantığı ile çalışır ancak PriorityQueue ile artık bunu customize edebileceğiz.
Process Path
Küçük bir geliştirme ama hoşuma gitti. Yeni bir
Process instance almadan path bilgisine ulaşabiliyoruz.
Math Api
.Net 6'da yeni
Math arayüzleri eklendi.
New methods:
• SinCos
• ReciprocalEstimate
• ReciprocalSqrtEstimate
New overloads:
• Min, Max, Abs, Sign, Clamp supports nint and nuint
• DivRem variants return a tuples
ArgumentNullException
Küçük bir geliştirme daha. Bir exception oluşturmadan önce sürekli
null olup olmadığını kontrol etmeye gerek kalmadı.
Wait Async
.Net 6'da async bir task için işlemin istenildiği süre içerisinde tamamlanmasını yapılandırabilirsiniz.
Operasyon zaman aşımına uğradığında
Timeout Exception hatasını alırsınız.
Not : İptal edilemeyen işlemler içindir.
System.Text.Json ve Yenilikleri
IAsyncEnumerable
Preview 4 ile beraber
IAsyncEnumerable<T> desteği eklendi. Böylece asenkron bir kaynaktan gelen datayı serialize ve deserialize edebiliyoruz.
Streaming Serialization
Streaming Deserialization
Ignore Cycles
.Net 5'te
System.Text.Json kullanarak circular referans kullanabilirdiniz ama onları ignore edemezdik. Circular Reference algılandığında
JsonException hatası atılırdı.
.Net 6'da circular reference ignore edebilirsiniz.
WriteableDom
System.Text.Json.Node için eklenen tipler.
namespace System.Text.Json.Node
{
public abstract class JsonNode {...};
public sealed class JsonObject : JsonNode, IDictionary<string, JsonNode?> {...}
public sealed class JsonArray : JsonNode, IList<JsonNode?> {...};
public abstract class JsonValue : JsonNode {...};
}
Örnek kodu da incelediğimizde anlıyoruz ki aramıza katılan bu yeni yapılar Json Serializer işlemlerinde de kullanılabilir. Örneğin şemasını belirleyemediğiniz yapılarda bu tipleri kullanabilirsiniz.
Ek olarak bu yeni yapılarla beraber dynamic desteği de bulunmaktadır.
Json Serialization Notification
System.Text.Json tarafında en çok beğendim özellik kesinlikle bu.
Özetlemek gerekirse
serialization veya
deserialization yapacağınız nesneyi ilgili arayüzlerden türettiğinizde ihtiyacınıza göre bazı
notification birimlerine sahip olacaksınız.
Kullanabileceğiniz arayüzler:
• IJsonOnDeserialized
• IJsonOnDeserializing
• IJsonOnSerialized
• IJsonOnSerializing
Serialization Property Ordering
.Net 6'da
System.Text.Json üzerinde
JsonPropertyOrderAttribute eklendi.
Bu attribute ile serialization sıralamasını belirleyebilirsiniz. Önceki sürümlerde bu reflection sıralaması ile belirleniyordu.
Biraz uzun olduğunun farkındayım. Kullandığımız teknolojileri daha yakından takip etmeliyiz. Eklenen her özellik veya yapılan her iyileştirme hayatımızda bazı noktaları değiştirebilir.
- C# 10
- EF Core 6.0
- LINQ
- .Net 6 API’s
- System.Text.Json
konu başlıklarında bu yeni sürümü inceledik ve eklenen hemen hemen tüm özellikleri öğrenmiş olduk. Serinin önceki yazılarını okumanızı tavsiye ederim. Preview sürümlerinde daha çok performans artışları ve buna neden olan olayları anlatmaya çalışmıştım.
Yazdığınız kodlar production ortamında hatasız çalışsın. Testler sizi korusun.