C# 12 ve .NET 8'deki Yenilikler
C# 12 ve .NET 8 ile birlikte gelen yeni özellikler ile performans iyileştirmeleri sağlanmış, kod yazma pratiklerini kolaylaştıran ve verimliliği arttıran yeni özellikler eklenmiştir.

Erdoğancan Yüksel
5 dakika 0 saniye okuma süresi

C# 12 ve .NET 8'deki Yenilikler

Erdoğancan Yüksel
5 dakika 0 saniye okuma süresi
C# 12 ve .NET 8 ile birlikte gelen yeni özellikler ile performans iyileştirmeleri sağlanmış, kod yazma pratiklerini kolaylaştıran ve verimliliği arttıran yeni özellikler eklenmiştir.

C# 12 ve .NET 8 ile gelen yenilikler geliştiricilere daha esnek, okunabilir ve performans odaklı kod yazma imkânı sunmaktadır. Bu makalede C# 12 ve .NET 8 ile birlikte gelen aşağıdaki özellikler kod örnekleri ile birlikte incelenmiştir:
- Primary Constructors
- Collection Expressions
- ref Readonly Parameters
- Default Lambda Parameters
- Alias any Type
- Inline Arrays
- Experimental Attribute
- Interceptors
Primary Constructors
Primary Constructors ile sınıf veya tanımlamalarını daha basit ve anlaşılabilir bir hale getirmek mümkün kılınmıştır. C# 9 ile birlikte gelen record içerisinde property tanımlama özelliği artık class ve struct'lar için de geçerli hale gelmiştir.
C# 12'den önceki kullanım için kod örneği:
public class BankAccount {
public string AccountID { get; }
public string Owner { get; }
public BankAccount(string accountID, string owner) {
AccountID = accountID;
Owner = owner;
}
public override string ToString() => $"Account ID: {AccountID}, Owner: {Owner}";
}
C# 12 ile birlikte kullanım için kod örneği:
public class BankAccount(string accountID, string owner) {
public string AccountID { get; } = accountID;
public string Owner { get; } = owner;
public override string ToString() => $"Account ID: {AccountID}, Owner: {Owner}";
}
Collection Expressions
C# 12 ile gelen Collection Expressions özelliği diziler, listeler ve koleksiyonların daha kısa ve net bir biçimde tanımlanmasına imkan tanımaktadır. Ayrıca spread element kullanarak ilgili koleksiyonlar birleştirilebilir.
C# 12'den önceki kullanım için kod örneği:
//Create an array:
int[] array = new int[] { 1, 2, 3, 4, 5, 6 };
var array1 = new int[] { 1, 2, 3, 4, 5, 6 };
string[] names = new string[] { "Test", "Test-2", "Test-3" };
//Create a span:
Span<char> span = new char[] { 'a', 'b', 'c', 'd' };
//Create a jagged 2D array:
int[][] matrix = new int[][] { new int[] { 1, 2, 3 }, new int[] { 4, 5, 6 } };
// Create a jagged 2D array from variables:
int[] row0 = new int[] { 1, 2, 3 };
int[] row1 = new int[] { 4, 5, 6 };
int[] row2 = new int[] { 7, 8, 6 };
int[][] twoDFromVariables = new int[][] { row0, row1, row2 };
//Dictionary:
Dictionary<string, int> dic = new Dictionary<string, int>();
Dictionary<string, string> dic2 = new();
C# 12 ile birlikte kullanım için kod örneği:
//Create an array:
int[] arrayNewVersion = [1, 3, 4, 5, 6];
//var a = [1,3,4,5, 6]; => //We can't use var anymore. Because we didn't declare type of the array!
string[] namesNewVersion = ["Test", "Test-2", "Test-3"];
//Create a span:
Span<char> spanNewVersion = ['a', 'b', 'c', 'd'];
//Create a jagged 2D array:
int[][] matrixNewVersion = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
// Create a jagged 2D array from variables:
int[] row0NewVersion = [1, 2, 3];
int[] row1NewVersion = [4, 5, 6];
int[] row2NewVersion = [7, 8, 9];
int[][] twoDFromVariablesNewVersion = [row0NewVersion, row1NewVersion, row2NewVersion];
// Spread element using:
int[] row0Spread = [1, 2, 3];
int[] row1Spread = [4, 5, 6];
int[] row2Spread = [7, 8, 9];
int[] single = [.. row0Spread, .. row1Spread, .. row2Spread]; //We can add all in one array.
foreach (var element in single)
{
Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,
//Dictionary:
Dictionary<string, int> dicNewVersion = [];
Dictionary<string, string> dic2NewVersion = [];
ref Readonly Parameters
ref Readonly Parameters özelliği ile bir fonksiyonda referans olarak eklenen verilerin değiştirilemez olması sağlanabilmektedir. C# 12 ref readonly özelliği ile değiştirilmesini istemediğimiz datalar için oldukça kullanışlı bir özellik sunmaktadır.
C# 12'den önceki kullanım için kod örneği:
class RefExample {
public void GetAge(in int age) {
Console.WriteLine($"Age is {age}");
//age++; => Get an error as: variable 'age' is a readonly variable
}
}
C# 12 ile birlikte kullanım için kod örneği:
class RefExampleNewVersion {
public void GetAge(ref readonly int age) {
Console.WriteLine($"Age is {age}");
//age++; => Get an error as: variable 'age' is a readonly variable
}
}
Default Lambda Parameters
Default Lambda Parameters özelliği lambda ifadelerinde parametre değerlerini tanımlamamıza olanak sağlamaktadır. C# 12'den önce parametre değerlerine default olarak değer ataması yapmamız gerekiyorken, C# 12 ile birlikte ilgili parametrelere default değer ataması yapma zorunluluğu ortadan kalkmıştır.
C# 12'den önceki kullanım için kod örneği:
var lambda = (int age = 30) => $"I am {age} years old."; //=> We didn't set age without default value.
lambda();
C# 12 ile birlikte kullanım için kod örneği:
var lambda = (int age) => $"I am {age} years old."; //=> We didn't set age without default value.
lambda(30);
Alias any Type
Alias any Type özelliği ile using takma adını her tür için kullanma imkanı sağlanmaktadır. Bunun anlamı tuple, array, pointer gibi türlerde using ile tanımlama yapılabilmesidir.
C# 12 ile birlikte kullanım için kod örneği:
using NameList = System.Collections.Generic.List<string>;
using Point3d = (int X, int Y, int Z);
List<string> nameList = new NameList();
nameList.Add("Can");
nameList.Add("Ahmet");
var point = new Point3d(5, 12, 13);
(int x, int y, int z) point2 = new Point3d(6, 8, 10);
Inline Arrays
Inline Arrays sabit boyutlu bir struct dizi oluşturarak performans iyileştirmesi sağlamaktadır.
C# 12 ile birlikte kullanım için kod örneği:
[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{
private int _element0;
}
var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{
buffer[i] = i;
}
foreach (var i in buffer)
{
Console.WriteLine(i);
}
Experimental Attribute
Experimental Attribute ile ek açıklama eklenmiş bir metot veya tür, o özelliğin deneysel olduğunu belirtir. Derleyici, ExperimentalAttribute ile ek açıklama eklenmiş bir yönteme veya türe erişirseniz bir uyarı verir.
C# 12 ile birlikte kullanım için kod örneği:
#pragma warning disable Experimental // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
var ex = new ExperimentalAttributeFeature();
#pragma warning restore Experimental // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
[Experimental("Experimental")]
public class ExperimentalAttributeFeature
{
}
Interceptors
Interceptor metodu bir metoda yapılan çağrıyı durdurarak kendi tanımlı metodunu çalıştırır. Interceptor'ler genellikle, metod çağrıları üzerinde yetkilendirme ve doğrulama yapmak, loglama yapmak, performans izlemek ya da hata ayıklamak gibi görevler için kullanılır.
- Interceptor sınıfı statik sınıf olmalıdır.
- Yakalamak istediğimiz bir sınıfın extension metodunu içermesi gerekmektedir.
- InterceptsLocation ek açıklamasına sahip olmalıdır.
C# 12 ile birlikte kullanım için kod örneği:
var example = new InterceptableExample();
example.InterceptableMethod(1); // L1: prints "interceptor 1"
example.InterceptableMethod(1); // L2: prints "other interceptor 1"
example.InterceptableMethod(2); // L3: prints "other interceptor 2"
example.InterceptableMethod(1); // prints "interceptable 1"
public class InterceptableExample
{
public void InterceptableMethod(int param)
{
Console.WriteLine($"interceptable {param}");
}
}
public static class InterceptorExample
{
[InterceptsLocation(version: 1, data: "...(refers to the call at L1)")]
public static void InterceptorMethod(this InterceptableExample example, int param)
{
Console.WriteLine($"interceptor {param}");
}
[InterceptsLocation(version: 1, data: "...(refers to the call at L2)")]
[InterceptsLocation(version: 1, data: "...(refers to the call at L3)")]
public static void OtherInterceptorMethod(this InterceptableExample example, int param)
{
Console.WriteLine($"other interceptor {param}");
}
}
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class InterceptsLocationAttribute(int version, string data) : Attribute
{
}
Sonuç olarak C# 12 ve .NET 8 ile birlikte gelen yenilikler kodlarımızda performans artışı sağlamaya yardımcı olmakta, yazılım gelişitiricilere esnek ve güvenli kodlama deneyimi sunmaktadır.