.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;
.Net 6 ve Yenilikleri #2 (Preview 4) | by Furkan Güngör | Devops Türkiye☁️ 🐧 🐳 ☸️ | Medium
.NET 6 ve Yenilikleri — YouTube
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 struct
yapıları field initializers
desteklenmezdi.
C# 10 ile birlikte struct
yapıları için field initializers
desteklenir. 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.
Breaking changes in .NET 6 — .NET | Microsoft Docs
ASP.NET Core updates in .NET 6 Preview 2 — .NET Blog (microsoft.com)
Announcing .NET 6 Preview 2 — .NET Blog (microsoft.com)
Announcing Entity Framework Core 6.0 Preview 2 — .NET Blog (microsoft.com)
ASP.NET Core updates in .NET 6 Preview 4 — .NET Blog (microsoft.com)
Routing in ASP.NET Core | Microsoft Docs
Reduce allocations for Cookies. by jkotalik · Pull Request #31258 · dotnet/aspnetcore (github.com)
Announcing Entity Framework Core 6.0 Preview 4: Performance Edition (microsoft.com)
Advanced Performance Topics | Microsoft Docs
Interceptors — EF Core | Microsoft Docs
Round 20 results — TechEmpower Framework Benchmarks
.NET 6 Preview 4 İle Beraber System.Text.Json API’larına Gelen Yenilikler (ilkayilknur.com)