Vấn đề với "release note articles"
Mỗi khi .NET release, có hàng chục bài "X tính năng mới trong .NET Y". Vấn đề là hầu hết chỉ dịch lại changelog mà không trả lời câu hỏi thực sự của developer: "Điều này ảnh hưởng thế nào đến project đang chạy của tôi?"
Bài này tiếp cận khác - chúng tôi chọn lọc những gì thực sự quan trọng và giải thích impact cụ thể.
1. Performance improvements - không cần đổi code
Đây là loại improvement tốt nhất: bạn không cần làm gì, hệ thống tự nhanh hơn.
.NET 9 benchmarks (từ Microsoft):
- Throughput tăng 15-18% trong một số workloads
- GC improvements: giảm pause time trong server GC
- JIT improvements: better inlining, better SIMD vectorization
Điều này có nghĩa là gì với bạn:
Upgrade .NET runtime (không nhất thiết phải upgrade code) thường cho free performance improvement. Với production apps có traffic cao, điều này rất đáng.
2. LINQ improvements - thực sự useful
CountBy và AggregateBy
// .NET 8 và trước - verbose
var wordCounts = text.Split(' ')
.GroupBy(w => w.ToLower())
.ToDictionary(g => g.Key, g => g.Count());
// .NET 9 - cleaner
var wordCounts = text.Split(' ')
.CountBy(w => w.ToLower());
// Returns IEnumerable<KeyValuePair<string, int>>
// AggregateBy - aggregate theo key
var orderTotalsByCustomer = orders
.AggregateBy(
keySelector: o => o.CustomerId,
seed: 0m,
func: (total, order) => total + order.Amount
);
Impact: Code LINQ dễ đọc hơn, ít allocations hơn so với GroupBy().ToDictionary() pattern.
Index() method
// .NET 8
foreach (var (index, item) in items.Select((item, i) => (i, item)))
{
Console.WriteLine($"{index}: {item}");
}
// .NET 9 - clean hơn
foreach (var (index, item) in items.Index())
{
Console.WriteLine($"{index}: {item}");
}
3. System.Text.Json improvements
Serialization của ReadOnlySpan và ReadOnlySpan
Relevant với high-performance scenarios:
// .NET 9: Serialize thẳng từ span - không copy
ReadOnlySpan<byte> rawJsonBytes = GetRawBytes();
var obj = JsonSerializer.Deserialize<MyType>(rawJsonBytes);
JsonSchemaExporter - mới và useful
// Generate JSON Schema từ C# type - useful cho API documentation
var schema = JsonSchemaExporter.GetJsonSchemaAsNode(
typeof(CreateOrderRequest),
new JsonSerializerOptions { WriteIndented = true }
);
Console.WriteLine(schema.ToJsonString(new JsonSerializerOptions { WriteIndented = true }));
// Output: JSON Schema cho CreateOrderRequest
4. C# 13 - syntax mới
params collections
// Trước: chỉ work với array
void LogMessages(params string[] messages) { }
// C# 13: work với bất kỳ collection type
void LogMessages(params IEnumerable<string> messages) { }
void LogMessages(params List<string> messages) { }
void LogMessages(params ReadOnlySpan<string> messages) { } // Zero-allocation!
Lock object với System.Threading.Lock
// Trước
private readonly object _lock = new();
lock (_lock) { /* ... */ }
// C# 13 - dedicated Lock type với better tooling support
private readonly Lock _lock = new();
lock (_lock) { /* ... */ }
// Lock.EnterScope() cho using pattern
using (_lock.EnterScope()) { /* ... */ }
5. Hybrid Cache - thực sự quan trọng
.NET 9 giới thiệu HybridCache - replacement cho IMemoryCache + IDistributedCache pattern:
// Program.cs
builder.Services.AddHybridCache(options =>
{
options.MaximumPayloadBytes = 1024 * 1024; // 1MB max per entry
options.DefaultEntryOptions = new HybridCacheEntryOptions
{
Expiration = TimeSpan.FromHours(1), // L2 (distributed) TTL
LocalCacheExpiration = TimeSpan.FromMinutes(5) // L1 (memory) TTL
};
});
// Usage
public class ProductService
{
private readonly HybridCache _cache;
public async Task<Product> GetProductAsync(int id, CancellationToken ct = default)
{
return await _cache.GetOrCreateAsync(
key: $"product:{id}",
factory: async cancel => await _repository.GetByIdAsync(id, cancel),
cancellationToken: ct
);
}
}
Tại sao quan trọng:
HybridCache có built-in stampede protection - khi cache miss, chỉ một request đi xuống database, các requests khác chờ kết quả. Cực kỳ useful cho high-traffic endpoints.
Khi nào nên upgrade?
| Scenario | Recommendation |
|---|---|
| New project | Dùng .NET 9 ngay |
| Project .NET 8 đang chạy ổn | Upgrade vào sprint tiếp theo - low risk |
| Project .NET 6/7 | Test kỹ trước - có một số breaking changes |
| Legacy .NET Framework | Chưa cần migrate - đây là câu chuyện khác |
.NET 9 là Standard Term Support (STS) - support đến 12/2026. Nếu cần Long Term Support, chờ .NET 10 (dự kiến 11/2026).
Kết
.NET 9 không phải bản release "wow" nhất, nhưng có nhiều improvements thực chất - đặc biệt HybridCache và performance. Với project đang chạy .NET 8, upgrade là low-risk và đáng làm.
Tham khảo
- What's new in .NET 9: learn.microsoft.com/dotnet/core/whats-new/dotnet-9
- .NET 9 announcement: devblogs.microsoft.com/dotnet
BKGlobal Tech Team