Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
C# String API'si Ayrıntılı: Arama, Bölme, Birleştirme, Kırpma ve Değiştirme Method'ları
String'de string arayan IndexOf, StartsWith ve EndsWith varsayılan olarak culture'a duyarlıdır; char arayanlar, Contains, Replace ve Split ise ordinal çalışır, bu yüzden makine verisinde her zaman StringComparison.Ordinal vermek gerekir. Bookstore'da slug üretme ve ISBN normalizasyonu üzerinden Split seçeneklerini, Join ile += farkını, AsSpan'i, SearchValues ve CompositeFormat'ı ve .NET 11'in Rune overload'larını gerçek çıktılarla gösteriyoruz.
C#'ta Format String'leri: Standart ve Custom Sayı/Tarih Formatları, Alignment ve Composite Formatting
Format string'i değeri culture'ın kurallarıyla string'e çevirir: N, C, d ve D culture'a göre değişir, o, s ve InvariantCulture ise makineye giden çıktıyı sabit tutar. Bookstore'un fatura satırı üzerinden standart ve custom sayı/tarih formatlarını, alignment'ı, para birimini veriden almayı, ICU'da N'nin 3 ondalık yazmasını ve Isbn tipini ISpanFormattable ile yazdırılabilir yapmayı gerçek çıktılarla gösteriyoruz.
.NET'te Globalization: CultureInfo, CurrentCulture/CurrentUICulture, Türkçe I ve Linux'ta ICU
.NET'te CurrentCulture format ve karşılaştırmayı, CurrentUICulture arayüz metnini belirler; ikisi de async akışla taşınır ve container'da ICU yoksa invariant mode'a düşer. Bookstore'un katalog sıralaması ve arama kutusu üzerinden Türkçe sıralamayı, ı/İ dönüşümünü, culture'lı dictionary comparer tuzağını, PredefinedCulturesOnly'yi ve chiseled/alpine image'larda tr-TR'nin nasıl kırıldığını gerçek çıktılarla gösteriyoruz.
Sayılarla Günlük İşler: Math, Yuvarlama Modları, Random.Shared, Guid v4/v7 ve BigInteger
Math.Round varsayılan olarak çifte yuvarlar (2,5 → 2), decimal format'ları ise sıfırdan uzağa; para için modu açıkça verip önce yuvarlamak, sonra format'lamak gerekir. Bookstore'un kampanya indirimi üzerinden MidpointRounding modlarını, double ile para hatasını ve .NET 11'deki decimal dönüşüm değişikliğini, Random.Shared ile thread güvenliğini, Guid v7'nin sıralama davranışını ve BigInteger'ı gerçek çıktılarla gösteriyoruz.
Encoding, Base64, Hex ve URI: UTF-8, BOM, Windows-1254, Base64Url, Uri ve URL Encoding
String ile byte arasındaki her geçişte encoding sözleşmenin parçasıdır: yanlış encoding Türkçe harfleri sessizce bozar, BOM CSV başlığına görünmez bir karakter ekler, Base64 ise şifreleme değildir. Bookstore'un eski muhasebe sisteminden gelen Windows-1254 verisi ve arama linki üzerinden Encoding, CodePagesEncodingProvider, Base64Url, ToHexStringLower, URL encoding API'lerinin farkları, QueryHelpers ve Uri'nin tuzaklarını gerçek çıktılarla gösteriyoruz.
Tarih ve Saat İleri: TimeZoneInfo, IANA/Windows Id'leri, ParseExact, ISO 8601 ve Tarih Aritmetiği
Tarih ve saat hatalarının çoğu üç yerden çıkar: yanlış time zone id'si, Kind'ı belirsiz parse edilmiş bir DateTime ve ay sonunu ya da yaz saatini hesaba katmayan aritmetik. Bookstore'un 5 iş günlük teslim kuralı ve Frankfurt deposu üzerinden TimeZoneInfo'nun Windows/IANA id davranışını, ParseExact ve DateTimeStyles'ı, ISO 8601 round-trip'ini, DateOnly/TimeOnly JSON'unu ve TimeProvider ile test edilebilir tarih hesabını gerçek çıktılarla gösteriyoruz.
Environment, Process ve Stopwatch: Ortam Bilgisi, Dış Komut Çalıştırmak ve Süre Ölçmek
Harici bir komutu .NET'ten güvenle çalıştırmanın üç kuralı var: argümanları ArgumentList ile ver, stdout ve stderr'i aynı anda oku, exit code'u ve timeout'u kontrol et. Bookstore'un gece raporu aracı üzerinden Environment ve RuntimeInformation'ı, ortam değişkenlerini, SpecialFolder ve AppContext switch'lerini, Process'teki deadlock ve injection tuzaklarını, .NET 11'in Process.RunAsync API'lerini ve Stopwatch ile süre ölçmeyi gerçek çıktılarla gösteriyoruz.
Konsol Uygulaması ve CLI Aracı Yazmak: args, System.CommandLine, Exit Code, Renkli Çıktı ve Generic Host
İyi bir CLI aracı args'ı elle parse etmez, sonucu stdout'a ve hataları stderr'e yazar, her durum için belgelenmiş bir exit code döner ve Ctrl+C'de yarım dosya bırakmaz. Bookstore'un bookstore-admin import-prices aracını System.CommandLine 3.0 ile yazıyor; yardım ve tab completion'ı, exit code sözleşmesini, SIGINT/SIGTERM ile iptali, NO_COLOR ve .NET 11'in FORCE_COLOR desteğini ve Generic Host ile DI ve logging'i gerçek çıktılarla gösteriyoruz.
Guard Clause Yardımcıları, Equality Helper'ları ve .NET 8'den 11'e BCL'de Gelenler
ArgumentNullException.ThrowIfNull ve .NET 8'in ArgumentOutOfRangeException helper'ları, CallerArgumentExpression sayesinde parametre adını, değeri ve kuralı tek satırda exception'a yazar. Bookstore'un Order constructor'ını bu helper'lara çeviriyor; kendi guard method'larını, multi-targeting tuzağını, HashCode.Combine ve değişen key'leri, comparer seçimini, Lazy<T>'nin exception saklamasını ve .NET 8'den 11'e BCL'ye gelen API'lerin tablosunu gösteriyoruz.