C# 11
C# 11 ile gelen Raw string literals, List patterns, Required Members, Generic math, static abstract, static virtual, UTF-8 string literals yenilikleri kod örnekleriyle yer alıyor.
C# 11 ile gelen özelliklere bakmadan önce C# 10 ile gelen özelliklere buradan bakabilirsiniz.
Raw string literals
Özellik XML, HTML ve JSON gibi veri türlerindeki metinsel-string işlemlerinde ortaya çıkan kaçış karakteri gibi sorunları gidermektedir.
Kullanım için 3 veya daha fazla çift tırnak işareti kullanımı yeterli olacaktır.
string mesaj = """"Hoşgeldiniz sayın "Yusuf Sezer" dedi."""";
NOT: 3 tırnak kullanımı tavsiye edilir.
Uzun metinlerde boşluk ve girinti çıktıya dahil edilir.
string uzunMesaj = """
Bu uzun bir mesaj.
Birkaç satırı var.
Bazıları diğerlerinden daha fazla
girintilidir.
Bazıları ilk sütundan başlar.
Bazılarında "alıntılanmış metin" vardır.
""";
Console.WriteLine(uzunMesaj);
XML ve JSON formatında çıktılarda kolaylıklık sağlar.
string xmlMesaj = """
<kisi>
<sira>1</sira>
<adi>Yusuf</adi>
<soyadi>Sezer</soyadi>
</kisi>
""";
Console.WriteLine(xmlMesaj);
string jsonKisiler = """
{"kisiler": [
{ "sira": "1", "adi": "Yusuf", "soyadi": "Sezer" },
{ "sira": "2", "adi": "Ramazan", "soyadi": "Sezer" },
{ "sira": "3", "adi": "Sinan", "soyadi": "Sezer" },
{ "sira": "4", "adi": "Mehmet", "soyadi": "Sezer" }
]}
""";
Console.WriteLine(jsonKisiler);
XML ve JSON örnekleri XML Nedir? ve JSON Nedir? yazısından alınmıştır.
String interpolation özelliğiyle birlikte kullanılarak metin içerisine değer ataması yapmayı sağlar.
var firstName = "Yusuf";
var lastName = "Sezer";
string jsonKisi = $$"""
{ "sira": "{{Guid.NewGuid()}}", "adi": "{{firstName}}", "soyadi": "{{lastName}}" }
""";
Console.WriteLine(jsonKisi);
Raw string literals özelliği ASP.NET web uygulamaları, regex-düzenli ifadeler kullanımında oldukça faydalı olacaktır.
static abstract
Özellik arayüz-interface içerisinde static metotlarda abstract anahtar kelimesini kullanımı sağlar.
MyInterface.MyName();
interface MyInterface {
// Default interface methods
static void MyName() => Console.WriteLine("Yusuf Sezer");
// static abstract
static abstract void MyName2();
}
NOT: C# 8 ile birlikte gelen Default interface methods özelliğiyle karıştırmamak amacıyla abstract anahtar kelimesi kullanılır.
static virtual
Özellik generic tür üzerinden metota erişimi sağlar.
interface MyInterface {
// static virtual
static virtual void MyName() => Console.WriteLine("Yusuf Sezer");
// static abstract
static abstract void MyName2();
}
class MyClass<T> where T : MyInterface {
public MyClass() {
// A static virtual or abstract interface member can be accessed only on a type parameter.
// MyInterface.MyName(); // hata
}
public static void MyName2() {
T.MyName(); // type üzerinden static virtual erişim
}
}
static abstract ve static virtual tanımları C# 11 ile yeniden tanımlanan operatörlerin aşırı yüklenmesi için alt yapı oluşturur.
Detaylı bilgi için C# Operatörlerin Aşırı Yüklenmesi yazıma bakabilirsiniz.
Generic math support
Özellik generic türler için matematiksel işlemler yapmayı sağlar.
İki int türünden sayının toplanması işlemi aşağıdaki metot ile yapılabilir.
Console.WriteLine(Hesap.Topla(10, 20));
class Hesap {
public static int Topla(int x, int y) => x + y;
}
Ancak double, long ve decimal gibi farklı türler için ayrıca metot yazılması gerekir.
Generic tür ile işlem yapıldığında belirtsiz tür için matematiksel işlemler yapılamayacağı hatası alınır.
Console.WriteLine(Hesap.Topla(10, 20));
Console.WriteLine(Hesap.Topla(5.4D, 6.8D));
Console.WriteLine(Hesap.Topla(3L, 8L));
Console.WriteLine(Hesap.Topla(99M, 23M));
class Hesap {
// Operator '+' cannot be applied to operands of type 'T' and 'T'
public static T Topla<T>(T x, T y) => x + y;
}
C# 11 ile birlikte gelen static abstract, static virtual özellikleri ile tanımlanan INumber arayüzü ve generic constrait sayesinde generic türler için matematiksel işlemin yapılması sağlanır.
using System.Numerics;
Console.WriteLine(Hesap.Topla(10, 20));
Console.WriteLine(Hesap.Topla(5.4D, 6.8D));
Console.WriteLine(Hesap.Topla(3L, 8L));
Console.WriteLine(Hesap.Topla(99M, 23M));
class Hesap {
public static T Topla<T>(T x, T y) where T : INumber<T> => x + y;
}
Yeni gelen özelliklerler birlikte C# operatörlerin aşırı yüklenmesi I-islem-Operators (IAdditionOperators, ISubtractionOperators, IBitwiseOperators vb.) arayüzleri üzerinden yapılması sağlanmıştır.
Generic attributes
Özellik nitelik-attributes tanımında generic tür kullanımını sağlar.
Yazdir(Convert.ToString(DateTime.Now));
// C# 11 öncesi
[MyAttribute(typeof(string))]
void Yazdir(string neyi) => Console.WriteLine(neyi);
// C# 11 - generic attribute
[MyAttribute2<string>]
void Yazdir2(string neyi) => Console.WriteLine(neyi);
public class MyAttribute : Attribute {
public MyAttribute(Type type) => MyType = type;
public Type MyType { get; }
}
// C# 11 - generic attribute
public class MyAttribute2<T> : Attribute { }
UTF-8 string literals
Özellik web tabanlı uygulamalarda sıklıkla kullanılan UTF8 kullanımı daha kolay hale getirmek için u8 son ekini sağlar.
using System.Text;
var myName = "Yusuf Sezer"u8;
Console.WriteLine(Encoding.Default.GetString(myName));
Son ek kullanıldığında dönüş string yerine bellek alanının ifade eden ReadOnlySpan<byte> olacaktır.
Newlines in string interpolations
Özellik $” ve $@” gibi string interpolation ifadelerinde {} ifadesinin birden fazla olarak kullanılmasını sağlar.
var myName = "Yusuf Sezer";
// {} birden fazla satır
var myText = $"Uzunluk: {
myName.Length
}";
Console.WriteLine(myText);
List patterns
Özellik [] operatörü ile birlikte discard (_), range pattern (..) ve pattern matching (pattern combinators, relational patterns) dizi kontrolü-eşleşmesi yapmayı sağlar.
int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers is [1, 2, 3]);
Console.WriteLine(numbers is [0 or 1, <= 2, >= 3]); // pattern matching ()
Console.WriteLine(numbers is [0 or 1, _, _]); // discard pattern (_)
Console.WriteLine(numbers is [0 or 1, ..]); // range pattern (...)
// veya numbers is [.., var myNumber]
if (numbers is [_, _, var myNumber]) {
Console.WriteLine($"My number: {myNumber}");
}
File-local types
Özellik aynı isimli sınıf-arayüz vb. adlandırmaları sırasında ortaya çıkan karmaşıklığı gidermek için sınıf-arayüz vb. sadece aynı dosya üzerinden erişimi sağlayan file erişim belirtecini sağlar.
// Program.cs
// erişim hatası
// CS0246 The type or namespace name 'MyInterface' could not be found
class Program : MyInterface { }
// MyInterface.cs
file interface MyInterface { }
class MyClass : MyInterface { }
Required Members
Özellik class, struct ve record içerisinde yer alan property-özellik ve field-alan değer ataması yapılmasını zorunlu hale getirir.
// CS9035 Required member 'Person.FirstName'
// Person yusuf = new();
Person yusuf = new Person { FirstName = "Yusuf", LastName = "Sezer" };
class Person {
public Guid Id { get; set; } = Guid.NewGuid();
public required string FirstName { get; set; }
public string? MiddleName { get; set; }
public required string LastName { get; set; }
}
Özellik private ve protected erişim belirleyici ile kullanımı tanımı gereği yapılamaz.
Özelliklerin değer atamadan kullanımını engellediğinden SetsRequiredMembers attribute-özelliği ile birlikte davranışın değiştirilmesi sağlanabilir.
using System.Diagnostics.CodeAnalysis;
Person yusuf = new();
class Person {
public Guid Id { get; set; } = Guid.NewGuid();
public required string FirstName { get; set; }
public string? MiddleName { get; set; }
public required string LastName { get; set; }
// required alanlara değer atandığını bildirir.
[SetsRequiredMembers]
public Person() { }
}
C# 11 sürümünde ASP.NET projelerinde JSON, XML gibi farklı veri yapılarıyla çalışmayı kolaylaştıran Raw string literals ve UTF-8 string literals ön plana çıkıyor.
Bu özelliklerin yanında C# operatörlerin aşırı yüklenmesi arayüzler üzerinden yürütmek için static abstract ve static virtual anahtar kelimesiyle birlikte generic math desteği sağlıyor.
Ayrıca C# 7 sürümünden beri güncellenerek genişleyen pattern matching özelliğin kullanım alanının genişlemesi yer alıyor.
C# 11 sürümünü kullanmak için .csproj dosyasında <LangVersion>11.0</LangVersion> ifadesini kullanımı yeterli olacaktır.
Yeni gelen özellikleri .NET 7 ile kullanabilirsiniz.
.NET Derslerine buradan ulaşabilirsiniz.
Hayırlı günler dilerim.