Her ekibin ayrı ayrı yazdığı kodu, tek satıra indirin.
string, object, koleksiyon, JSON/XML ve reflection işlemleri için
performans odaklı extension method koleksiyonu. Reflection Expression Tree ile bir kez
derlenip cache'lenir; string/JSON işlemleri mümkün olduğunca Span<T> üzerinden yürütülür.
// her tip için ayrı try/catch veya TryParse bloğu int result; if (!int.TryParse(request.Query["page"], NumberStyles.Integer, CultureInfo.InvariantCulture, out result)) { result = 1; // varsayılan }
// tek satır, generic, culture-safe int page = request.Query["page"].ToString().ToSafe<int>(1); // katı parse gerekiyorsa exception fırlatan To<T> decimal price = "1234.56".To<decimal>();
Aynı kodu her ekip biraz farklı, biraz eksik yeniden yazıyor.
String parse, null kontrolü, dictionary doldurma, JSON/XML dönüşümü, reflection ile property okuma — kurumsal .NET projelerinde tekrar eden, hem bug hem performans riski taşıyan işlemler. DSO.Core.Extensions bunu tek yerde, üç ilkeyle toplar.
Zero / Low Allocation
Span<char>, ReadOnlySpan<char>, string.Create ve lazy allocation ile GC baskısı azaltılır. Ara string veya iterator üretilmez.
Cached Reflection
Property/field erişimi her seferinde reflection ile değil, bir kez derlenip ConcurrentDictionary'de cache'lenen Expression Tree delegate'leriyle yapılır.
Null-Safe, Fail-Safe API
Metotlar null girdide patlamak yerine TryXxx / ToSafe<T> desenleriyle güvenli varsayılan davranış sergiler.
Kaynak kod olarak ekleyin, kullanmaya başlayın.
Proje şu an kaynak kod olarak paylaşılıyor — ilgili .cs dosyalarını projenize dahil edip yukarıdaki using ifadesini eklemeniz yeterli. NuGet paketi olarak yayınlandığında bu bölüm dotnet add package DSO.Core.Extensions şeklinde güncellenecek.
Her modül, kendi sorumluluk alanına odaklanır.
Her kart kendi "kütüphanesiz / ile" örneğini içerir — anahtarı çevirin, farkı görün.
Kütüphane genelinde tekrar eden altı tasarım kararı.
Önce Span, gerekmedikçe string yok
Arama/parse işlemlerinde önce ReadOnlySpan<char> yolu denenir; gerçekten gerekmedikçe ara string üretilmez.
Tek geçişte üretim
ToFill, AppendEnd gibi metotlar sonuç string'i doğrudan hedef buffer üzerinde inşa eder; ara StringBuilder adımı yoktur.
Yalnızca gerektiğinde ayır
List<T> gibi koleksiyonlar yalnızca gerçekten ihtiyaç anında — örn. ilk eşleşme bulunduğunda — oluşturulur.
Somut tipler için ayrı yol
List<T> / T[] gibi somut kaynaklar için struct enumerator/indexer kullanan yollar, genel IEnumerable<T> fallback'ine göre önceliklidir.
Derlenmiş delegate cache'i
Reflection her çağrıda tekrar çalıştırılmaz; Expression.Lambda(...).Compile() sonucu bir kez saklanır, sonraki çağrılar saf delegate hızında çalışır.
Varsayılan davranış exception yerine
Kritik olmayan metotlar bool dönen TryXxx veya varsayılan değer dönen ToSafe<T> tercih eder; To<T> gibi strict varyantlar bilinçli olarak exception fırlatır.
Pull request açmadan önce üç şeye dikkat edin.
Sorumluluk alanına uyun
Yeni eklenen metotların ilgili extension sınıfının sorumluluk alanına uygun olmasına dikkat edin — örn. string işlemleri StringExtensions'a, koleksiyon işlemleri CollectionExtensions'a.
Null-güvenli ve allocation-bilinçli yazın
Mümkün olduğunca null-güvenli yazın; span kullanılabiliyorsa span kullanın.
XML doc + "kütüphanesiz" karşılaştırması ekleyin
Public metotlara kısa XML doc yorumları ekleyin ve mümkünse "kütüphanesiz nasıl yazılırdı" karşılaştırmasını PR açıklamasına ekleyin.
- Yeni metot doğru extension sınıfında
- Null girdi davranışı test edildi
- Gerekirse Span/ReadOnlySpan değerlendirildi
- Public API'ye XML doc yorumu eklendi
- PR açıklamasında önce/sonra örneği var