C# 10

Paylaş

C# 10 ile birlikte gelen Global Using Directive, Record structs, Interpolated string handlers, File-scoped namespaces, Constant Interpolated Strings yenilikleri kod örnekleri ile birlikte yer alıyor.

C# 10 ile gelen özelliklere bakmadan önce C# 9 ile gelen özelliklere buradan bakabilirsiniz.

Record structs

Özellik değişmez-immutable değer türleri oluşturmayı daha kısa ve etkili olarak aşağıdaki gibi sağlar.

Person yusuf = new();
yusuf.FirstName = "Yusuf";
System.Console.WriteLine(yusuf);

yusuf.LastName = "Sezer";
(string FirstName, string LastName) = yusuf;
System.Console.WriteLine($"{FirstName} {LastName}");

record struct Person(string FirstName, string LastName);

Parameterless struct constructors

Özellik struct-değer türleri için parametresiz kurucu tanımlamayı sağlar.

Person yusuf = new();
System.Console.WriteLine(yusuf);

Human sefa = new();
System.Console.WriteLine(sefa);

record struct Person(string FirstName, string LastName) {
    public Person() : this("Yusuf", "Sezer") { } // Parameterless struct constructors
}

struct Human {
    public Human() { // Parameterless struct constructors
        FirstName = "Yusuf";
        LastName = "Sezer";
    }
    public string FirstName { get; init; }
    public string LastName { get; init; }
}

Interpolated string handlers

Özellik C# 6 ile birlikte gelen String interpolation özelliğini yönetmek için InterpolatedStringHandler niteliği AppendLiteral ve AppendFormatted metotlarını sağlar.

using System;
using System.Runtime.CompilerServices;
using System.Text;

var firstName = "Yusuf";
var lastName = "Sezer";

Yazdir($"{Guid.NewGuid()} {firstName} {lastName} {DateTime.Now}");

void Yazdir(MyInterpolatedStringHandler stringHandler) {
    Console.WriteLine(stringHandler.GetFormattedText());
}

[InterpolatedStringHandler]
public ref struct MyInterpolatedStringHandler {
    StringBuilder stringBuilder;

    public MyInterpolatedStringHandler(int literalLength, int formattedCount) {
        stringBuilder = new StringBuilder(literalLength);
        Console.WriteLine($"literalLength: {literalLength} formattedCount: {formattedCount}");
    }

    public void AppendLiteral(string value) {
        stringBuilder.Append(value);
    }

    public void AppendFormatted<T>(T t) {
        Console.WriteLine($"Değer: {{{t}}} Tür: {typeof(T)}");
        stringBuilder.Append(t?.ToString());
    }

    internal string GetFormattedText() => this.stringBuilder.ToString();
}

Özelliğe ait diğer metot tanımları için System.Runtime.CompilerServices altında yer alan DefaultInterpolatedStringHandler tanımını incelemek faydalı olacaktır.

C# 6 ile gelen özelliklere bakmak için C# 6 yazıma bakmalısın.

Global Using Directive

Özellik global ile belirtilen alanları projenin tamamında ayrıca using ile belirtmeden kullanmayı sağlar.

*.csproj dosyasına aşağıdaki kısım eklendiğinde

<ImplicitUsings>enable</ImplicitUsings>

derleyici varsayılan olarak arka planda aşağıdaki alanları tüm proje ekleyecektir.

global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

Varsayılanı değiştirmek için aşağıdaki gibi bir tanımın *.csproj dosyasına eklenmesi yeterli olacaktır.

<ItemGroup>
  <Using Remove="System.Threading.Tasks" />
  <Using Include="System.Drawing"/>
</ItemGroup>

File-scoped namespaces

Özellik namespace anahtar kelime kullanımını dosya kapsamında kullanımı ile daha basit hale getirir.

namespace YusufSezer;

class Program {
    public static void Main(string[] args) {
        YusufSezer.Person person = new("Yusuf","Sezer");
        Console.WriteLine(person);
    }
}

record Person(string FirstName, string LastName);

Extended property patterns

Özellik Pattern Matching kullanımında alt property-özelliklere erişimi daha kolay hale getirir.

Person yusuf = new("Yusuf", "Sezer", DateTime.Now);

// if (yusuf.BirthDate is DateTime { Date: { Date: { DayOfWeek: DayOfWeek.Monday } }) { } // yerine
if (yusuf.BirthDate is DateTime { Date.Date.DayOfWeek: DayOfWeek.Monday })
{
    Console.WriteLine(yusuf);
}

record Person(string FirstName, string LastName, DateTime BirthDate);

Lambda improvements

Lambda ifadelerinde nitelik-attribute, tür çıkarımı ve geri dönüş belirtme gibi özellikleri sağlar.

// lambda attributes
await Task.Run([Obsolete("Kullanımı kaldırıldı.")] () => Console.WriteLine("Yusuf Sefa Sezer"));

// inferred delegate type
var MyName = () => Console.Write("Yusuf Sezer");
await Task.Run(MyName);

// lambda return type
var StrMyName = string () => "Yusuf Sezer";

Constant Interpolated Strings

Özellik const ifadelerinde Interpolated Strings özelliğini kullanmayı sağlar.

Console.WriteLine(Info.FullProductName);

class Info {
    const string Language = "C#";
    const string Platform = ".NET";
    const string Version = "10.0";
    // constant interpolated strings
    public const string FullProductName = $"{Platform} - Language: {Language} Version: {Version}";
}

sealed ToString in record

Özellik record tanımında ToString metodunun ezilmesini önlemek için sealed kullanımını sağlar.

record Person(string FirstName, string LastName) {
    // sealed ToString in record
    public override sealed string ToString() {
        return $"{FirstName} {LastName}";
    }
}

record Student(string FirstName, string LastName, int Grade) : Person(FirstName, LastName) {
    // cannot override inherited member 'Person.ToString()' because it is sealed
    public override string ToString() {
        return $"{Grade} {FirstName} {LastName}";
    }
}

Improved definite assignment

İyileştirme ?. (null-conditional operator) ve çeşitli yeni operatörlerin kullanımındaki belirsizliği ortadan kaldırmaktadır.

Mixed declarations and expressions in deconstruction

İyileştirme deconstruction ifadelerinin kullanımını genişleterek tanımlı veya tanımsız değişkenleri birlikte kullanmayı sağlar.

Person yusuf = new("Yusuf", "Sezer");
Console.WriteLine(yusuf);

var FirstName = string.Empty;
// Mixed declarations and expressions in deconstruction
(FirstName, var LastName) = yusuf;
Console.WriteLine($"{FirstName} {LastName}");

record Person(string FirstName, string LastName);

AsyncMethodBuilder override

Özellik asenkron işlemlerin yönetimini nitelik-attribute ile yönetmeyi sağlar.

using System.Runtime.CompilerServices;

// async method builder override
[AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder<>))]
async Task MyTask() {
    await Task.Delay(1000);
}

CallerArgumentExpression

Nitelik hata ayıklama ve istisna yönetiminde daha anlamlı ve kullanılan parametrelere ulaşımı sağlar.

using System.Runtime.CompilerServices;

ValidateLength("Yusuf");

void ValidateLength(string value, [CallerArgumentExpression("value")] string argument = "") {
    if (value == null) {
        throw new ArgumentNullException(argument);
    }

    if (value.Length < 10) {
        throw new ArgumentException("En az 10 karakter olmalıdır.", argument);
    }
}

Enhanced #line directives

Özellik ASP.NET Razor gibi arka planda kod üreten bileşenlerde daha iyi önişlemeyi sağlayarak hata ayıklamayı daha hassas yapmayı sağlar.

Bu sürümdeki öne çıkan Global Using Directive ve Interpolated string handlers özelliğinin yanında önceki sürümdeki özelliklerin geliştirilmesi yapılmıştır.

C# 10 sürümünü kullanmak için .csproj dosyasında <LangVersion>10.0</LangVersion> ifadesini kullanımı yeterli olacaktır.

Yeni gelen özellikleri .NET 6 ile kullanabilirsiniz.

.NET Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.


Bunlarda ilgini çekebilir


LinkedIn grubuna buradan katılın.