.Net 6 ve Yenilikleri #3 (All Features)

Furkan Güngör
Devops Türkiye☁️ 🐧 🐳 ☸️
10 min readJan 15, 2022

--

.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 #1 (Preview 1 & Preview 2) | by Furkan Güngör | Devops Türkiye☁️ 🐧 🐳 ☸️ | Medium

.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.

deconstruction.cs

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.

deconstruction.cs

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.

--

--

Furkan Güngör
Devops Türkiye☁️ 🐧 🐳 ☸️

Solution Developer — I want to change the world, give me the source code.