C# 10
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.