C# 11

Paylaş

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.


Bunlarda ilgini çekebilir


Destek almak için tıklayın.