Ulaşım
- Adres: 2342 Sk, İpekyol, İpek Ap 49A, 63250 Haliliye/Şanlıurfa
- Telefon:
0505 532 36 38 - eMail: admin@alestaweb.com
Microsoft, .NET 9 ve C# 13 ile geliştiricilere son yılların en büyük performans ve dil yeniliklerini sundu (presented the biggest performance and language updates). Alesta Web olarak bu yazımızda; C# 13'ün params collections, yeni System.Threading.Lock tipi, partial properties ve method group natural type iyileştirmelerini; .NET 9'un Native AOT, Aspire cloud-native stack, HybridCache ve OpenAPI native desteği gibi yeniliklerini detaylıca anlatıyoruz. Eğer .NET geliştiriciyseniz (if you are a .NET developer), bu rehberi mutlaka inceleyin.
.NET 9, 12 Kasım 2024'te (November 12, 2024) yayınlandı. Standard Term Support (STS) sürümü olmasına rağmen (despite being an STS release), getirdiği yenilikler bir LTS sürümüne yakışacak seviyede. C# 13 ise dilin nesne yönelimli ve performans tarafında önemli ergonomik iyileştirmeler getiriyor (significant ergonomic improvements).
params List, Span, ReadOnlySpan ile çalışırSystem.Threading.Lock ile daha hızlı sync.NET 9, STS sürümü olduğu için 18 ay destek alır (18 months of support). LTS olan .NET 10, Kasım 2025'te yayınlanacak ve 3 yıl destek alacak.
C# 13 öncesinde params anahtar kelimesi sadece dizilerle (only with arrays) çalışırdı. Artık koleksiyon ifadelerinin desteklediği tüm tipleri kullanabilirsiniz (you can use any collection-expression-supported type).
// ESKİ (C# 12 ve öncesi)
public void Log(params string[] messages)
{
foreach (var msg in messages) Console.WriteLine(msg);
}
// YENİ (C# 13)
public void Log(params ReadOnlySpan<string> messages)
{
foreach (var msg in messages) Console.WriteLine(msg);
}
public void LogItems(params List<int> items)
{
foreach (var item in items) Console.WriteLine(item);
}
public void LogSet(params IEnumerable<double> values)
{
foreach (var v in values) Console.WriteLine(v);
}
ReadOnlySpan<T> kullandığınızda heap alloc'tan kaçınırsınız (avoid heap allocation). Bu özellikle yüksek performanslı API'lar için kritik (critical for high-performance APIs). Alesta Web testimizde aynı method 30% daha az GC pressure yarattı.
Onlarca yıldır lock statement'ı bir object üzerinde çalışırdı (worked on an object). Bu hem performans hem hataya açık bir yapıydı (error-prone). C# 13 ile yeni bir dedicated tip geldi: System.Threading.Lock.
// ESKİ
private readonly object _syncRoot = new();
public void DoWork()
{
lock (_syncRoot)
{
// critical section
}
}
// YENİ (C# 13)
private readonly Lock _lock = new();
public void DoWork()
{
lock (_lock) // Lock.EnterScope() çağırır
{
// critical section
}
}
// Veya manuel scope
using (_lock.EnterScope())
{
// critical section
}
Yeni Lock tipi, eski Monitor tabanlı lock'tan ~30-40% daha hızlıdır (faster than old Monitor-based lock). Ayrıca object header'da overhead bırakmaz (no overhead in object header).
C# 8'de partial methods, C# 13'te partial properties geldi. Bu özellik source generator senaryoları için ideal (ideal for source generator scenarios).
// Partial class — generator dosyası
public partial class UserViewModel
{
public partial string Name { get; set; }
public partial int Age { get; set; }
}
// Generated dosya (CodeGen tarafından üretilir)
public partial class UserViewModel
{
private string _name = string.Empty;
public partial string Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
// ...
}
MVVM framework'leri (CommunityToolkit.Mvvm gibi) bu özelliği INotifyPropertyChanged kodu üretmek için kullanır.
C# 13'te preview olarak gelen field keyword'ü, property setter/getter içinde implicit backing field'a erişim sağlar (provides access to implicit backing field).
// Preview feature — Aktivasyon için <LangVersion>preview</LangVersion>
public string Name
{
get => field ?? string.Empty;
set
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentException("Boş olamaz (cannot be empty)");
field = value;
}
}
Eskiden bir backing field tanımlamanız gerekiyordu (you had to define a backing field). Artık field compiler tarafından sağlanır (compiler-provided).
Native AOT (Ahead-of-Time compilation), .NET kodunu native ML kod olarak compile eder (compiles .NET code to native machine code). .NET 9 ile birlikte:
dotnet new webapiaot -n MyApi cd MyApi # AOT publish dotnet publish -c Release -r linux-x64 # Çıktı: bin/Release/net9.0/linux-x64/publish/MyApi (~8MB native binary) ls -lh bin/Release/net9.0/linux-x64/publish/MyApi
.NET Aspire, .NET 9 ile stable hale geldi (became stable). Microservice ve dağıtık uygulamalar için resmi cloud-native stack'tir (official cloud-native stack for microservices and distributed apps).
// AppHost.cs — Orchestration
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
var db = builder.AddPostgres("postgres")
.AddDatabase("appdb");
var api = builder.AddProject<Projects.MyApi>("api")
.WithReference(cache)
.WithReference(db);
builder.AddProject<Projects.MyWeb>("web")
.WithReference(api);
builder.Build().Run();
Yıllarca IMemoryCache + IDistributedCache ikisini birlikte kullanmak için cache-aside pattern manuel yazılıyordu. .NET 9 bu boşluğu HybridCache ile dolduruyor (fills this gap with HybridCache).
// Program.cs
builder.Services.AddHybridCache(options =>
{
options.DefaultEntryOptions = new HybridCacheEntryOptions
{
Expiration = TimeSpan.FromMinutes(10),
LocalCacheExpiration = TimeSpan.FromMinutes(1)
};
});
// Servis kullanımı
public class UserService(HybridCache cache)
{
public async Task<User> GetUserAsync(int id, CancellationToken ct)
{
return await cache.GetOrCreateAsync(
$"user-{id}",
async token => await FetchFromDbAsync(id, token),
cancellationToken: ct
);
}
}
Yıllarca ASP.NET Core uygulamalarında Swagger için Swashbuckle.AspNetCore paketini kullandık. .NET 9 ile birlikte OpenAPI desteği dahili (built-in) geldi.
// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenApi();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
}
app.MapGet("/users/{id}", (int id) => new { Id = id, Name = "Ahmet" })
.WithName("GetUser")
.WithOpenApi();
app.Run();
OpenAPI spec'i /openapi/v1.json URL'inden erişilebilir. Swagger UI için Scalar veya ReDoc gibi 3rd-party tool'lar entegre edilebilir (3rd-party tools can be integrated).
| Metric | .NET 8 | .NET 9 | İyileştirme |
|---|---|---|---|
| TechEmpower Plaintext (req/s) | 7.0M | 7.6M | +8.5% |
| Native AOT binary size | 12 MB | 8 MB | -33% |
| JSON deserialization | 100 ops | 125 ops | +25% |
| Regex (compiled) | 100 ops | 120 ops | +20% |
| Lock performance | 100 ops | 140 ops | +40% |
<PropertyGroup> <TargetFramework>net9.0</TargetFramework> <LangVersion>13.0</LangVersion> <Nullable>enable</Nullable> </PropertyGroup>
dotnet add package Microsoft.AspNetCore.OpenApi --version 9.0.* dotnet add package Microsoft.Extensions.Caching.Hybrid --version 9.0.* # Eski Swashbuckle bağımlılığını kaldır dotnet remove package Swashbuckle.AspNetCore
Migration öncesi dotnet build /p:TreatWarningsAsErrors=true ile uyarıları görün. .NET 9 yeni nullable analizleri ile bazı eski warning'leri error'a çevirir.
Alesta Web olarak tüm kod örneklerini .NET 9.0.3 ve C# 13 ile test ettik (tested with .NET 9.0.3 and C# 13).
.NET 9 ve C# 13, Microsoft'un .NET platformunu modern bulut, edge ve high-performance senaryolar için optimize ettiğini gösteriyor (shows .NET platform is optimized for modern cloud, edge and high-performance scenarios). Aspire'in stable olması, Native AOT iyileştirmeleri, HybridCache ve OpenAPI native desteği ile .NET 9, production'a almak için harika bir sürüm.
Hızlı Karar Rehberi / Quick Decision Guide:
Faydalı Linkler / Useful Links:
Alesta Web ekibi olarak .NET 9 ve C# 13 hakkında sorularınız varsa alestaweb.com'u ziyaret edin.
© 2026 AlestaWeb - Tüm hakları saklıdır.