C# 12
C# 12 ile gelen Primary constructors, Collection expressions, Inline arrays, Default lambda, Ref readonly, Experimental, using ve Interceptors yenilikleri kod örnekleriyle yer alıyor.
C# 12 ile gelen özelliklere bakmadan önce C# 11 ile gelen özelliklere buradan bakabilirsiniz.
Primary constructors
Özellik struct, class yapılarında kurucu tanımını record tanımına benzer olarak daha kısa yapmayı sağlar.
Özelliğin struct ile kullanımı aşağıdaki gibidir.
var rectangle = new Rectangle(20, 20);
Console.WriteLine(rectangle.Area);
public readonly struct Rectangle(double x, double y)
{
public readonly double Area { get; } = x * y;
}
Özelliğin class ile kullanımı aşağıdaki gibidir.
var yusuf = new Person("Yusuf", "Sezer");
Console.WriteLine(yusuf);
public class Person(string FirstName, string LastName)
{
public Guid Id { get; } = Guid.NewGuid();
public string FirstName { get; } = FirstName;
public string LastName { get; } = LastName;
public override string ToString() => $"{Id} {FirstName} {LastName}";
}
Özellik C# 9 ile birlikte gelen record yapısına benzer olarak daha kısa kurucu tanımını sağlamaktadır.
Collection expressions
Özellik koleksiyon tanımını tür belirlemeden yapmayı sağlar.
// C# 12 öncesi
//string[] people = new string[] { "Yusuf", "Ramazan", "Sinan", "Mehmet" };
// C# 12 - Collection expressions
string[] people = ["Yusuf", "Ramazan", "Sinan", "Mehmet"];
Console.WriteLine(people);
Özelliğin örnek kullanımı aşağıda yer almaktadır.
// dizi tanımlama
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];
// Create a list:
List<string> b = ["bir", "iki", "üç"];
// span tanımlama
Span<char> c = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];
// iki boyutlu jagged dizi tanımlama
int[][] ikiB = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
// iki boyutlu jagged dizi tanımlama
int[] s0 = [1, 2, 3];
int[] s1 = [4, 5, 6];
int[] s2 = [7, 8, 9];
int[][] ikiBDizi = [s0, s1, s2];
Özelliğin Spread element (..) ile kullanımı aşağıdaki gibidir.
string[] sesli = ["a", "e", "i", "o", "u"];
string[] unsuz = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "z"];
string[] alfabe = [.. sesli, .. unsuz, "y"];
Inline arrays
Özellik struct yapılarındaki bellek performansını arttırmak için System.Runtime.CompilerServices.InlineArray ile sağlar.
var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{
buffer[i] = i;
}
foreach (var i in buffer)
{
Console.WriteLine(i);
}
[System.Runtime.CompilerServices.InlineArray(50)]
public struct Buffer
{
private int _element;
}
Inline arrays özelliği unsafe anahtar kelimesi kullanmadan verilerin bellekte sıralı şekilde tutulmasını sağlayarak performans artışı sağlar.
Default lambda parameters
Özellik lambda ifadelerinde varsayılan-default değer belirtmeyi sağlar.
var Topla = (int x, int y = 1) => x + y;
Console.WriteLine(Topla(10));
Console.WriteLine(Topla(10, 5));
Ref readonly parameters
Özellik C# 7 ile birlikte gelen Readonly references özelliğini genişleterek in yerine ref readonly anahtar kelimesini kullanmayı sağlar.
void Yazdir(ref readonly int x, in int y)
{
Console.WriteLine($"x : {x}, y : {y}");
}
int x = 10;
Yazdir(ref x, 10);
Yazdir(in x, 20);
Özellik in anahtar kelimesinden farklı olarak daha fazla anlaşırlık sağlar.
Experimental attribute
Özellik System.Diagnostics.CodeAnalysis.ExperimentalAttribute attribute-niteliği ile tür, metot ve assemblies yapılarının deneysel olduğunu belirtmeyi sağlar.
[System.Diagnostics.CodeAnalysis.Experimental("InlineArrays")]
[System.Runtime.CompilerServices.InlineArray(50)]
public struct Buffer
{
private int _element;
}
using type alias
Özellik using anahtar kelimesiyle türlere takma isim vermeyi sağlar.
using Point = (int x, int y);
Özellik deneysel olduğunda üretim ortamında kullanımı önerilmemekte ve geliştirilmesi sürmektedir.
Interceptors
C# 12 ile birlikte gelen Interceptors özelliği derleme zamanında bir metoda yapılan çağrıyı durdurmayı veya farklı bir metoda yönlendirmeyi sağlar.
Özellik deneysel olduğunda üretim ortamında kullanımı önerilmemekte ve geliştirilmesi sürmektedir.
Bu sürümde daha kısa kod yazmayı sağlayan Primary constructors ve Collection expressions özellikleri ön plana çıkıyor.
C# 12 sürümünü kullanmak için .csproj dosyasında <LangVersion>12.0</LangVersion> ifadesini kullanımı yeterli olacaktır.
Yeni gelen özellikleri .NET 8 ile kullanabilirsiniz.
.NET Derslerine buradan ulaşabilirsiniz.
Hayırlı günler dilerim.