Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
C#'ta Span<T> ve Memory<T>: Allocation'sız Parse, stackalloc ve ref struct Kuralları
Span<T> ile kopyasız dilimleme ve allocation'sız parse, ölçülmüş allocation farkı, stackalloc ve güvenli kullanım pattern'i, ref struct kısıtları ve async kod için Memory<T>.
C#'ta Expression Tree: Lambda'yı Veri Olarak Tutmak ve EF Core'a Köprü
Func ile Expression<Func> farkı, ağacın node'larına bakmak ve Compile, Expression factory method'larıyla dinamik filtre kurmak, ExpressionVisitor ile küçük bir SQL çevirici, IQueryable ve EF Core 6'nın ToQueryString çıktısı, yakalanan değişkenin parametreye dönüşmesi, çevrilemeyen method hatası, CS0834, CS8072, CS8110 gibi sınırlar ve BenchmarkDotNet ile Compile'ın 70 mikrosaniyelik bedeli.
C#'ta Attribute ve Reflection: Kendi Attribute'unu Yazmak ve Okumak
Attribute'un metadata'da durup okunduğunda oluşması, Obsolete ve CS0618, AttributeUsage, positional ve named argümanlar, decimal'in attribute parametresi olamaması ve CS0181, reflection ile küçük bir validator, IDiscountRule uygulayan tipleri keşfedip Activator ve Invoke ile çalıştırmak, BenchmarkDotNet ile GetValue, cache'lenmiş PropertyInfo ve typed delegate karşılaştırması, trimming ve source generator sınırları.
C#'ta Nullable Reference Types Derinlemesine: NotNullWhen, MaybeNull ve API Tasarımı
Flow analysis'in method sınırında durması ve CS8602, NotNullWhen ile koşullu contract ve CS8762, kısıtsız T?'nin value type'ta düz T kalması, MaybeNullWhen ile generic Try pattern'i, NotNullIfNotNull, NotNull ve AllowNull, CS8618 için MemberNotNull, DoesNotReturn, runtime'da korumanın olmaması ve ThrowIfNull, kademeli geçiş için #nullable ve WarningsAsErrors.
C#'ta Pattern Matching Derinlemesine: Property, Positional ve Tuple Pattern'ler
Property pattern ve C# 10'un genişletilmiş yazımı, null ara adımda sessizce başarısız olan eşleşme, Deconstruct ile positional pattern, tuple pattern ile karar tablosu, not/and/or önceliği ve is not A or B tuzağı, var pattern ve when, CS8509, CS8524 ve CS8510 ile eksik ve erişilemeyen arm'lar, pattern matching ile polymorphism arasında seçim.
C#'ta Event: EventHandler, Güvenli Tetikleme ve Subscription Leak
event keyword'ünün delegate'i nasıl koruduğu ve CS0070, compiler'ın ürettiği private field ile add/remove method'ları, EventHandler konvansiyonu ve record ile event verisi, ?.Invoke ile güvenli tetikleme, kendi add/remove accessor'ların ve CS0079, WeakReference ile ölçülen 50 MB'lık subscription leak'i ve IDisposable dönen Subscribe.
C#'ta Lambda ve Closure: Yakalanan Değişken Tuzağı
Lambda'nın biçimleri ve C# 10 açık dönüş tipi, closure'ın değişkenin değerini değil kendisini yakalaması, compiler'ın ürettiği display class'ı reflection ile görmek, for döngüsünde yakalanan değişken ve C# 5'in foreach değişikliği, closure başına 88 byte allocation ölçümü, static lambda ve CS8820, deferred LINQ ile birleşen yakalama hatası.
C#'ta Delegate, Func ve Action: Method'u Değer Gibi Taşımak
Delegate bir method'u tutan tiptir: MulticastDelegate'ten derive eden class, Method ve Target, Func/Action/Predicate, C# 10 ile lambda'nın doğal tipi ve CS8917, method'u parametre olarak geçirmek, multicast delegate'in son sonucu ve kesilen zincir, delegate tipleri arası dönüşüm ve variance, null delegate ve -= ile çıkmayan lambda tuzakları.
C# Async ve .NET 9–10: Task.WhenEach, Lock Tipi ve Framework'teki Async LINQ
WhenAny döngüsünün yerini alan .NET 9 Task.WhenEach ve hatalı task'larla davranışı, C# 13 lock statement'ının tanıdığı System.Threading.Lock ile CS9216, CS1996, CS4007 ve CS9202 sınırları, .NET 10'da framework'e giren async LINQ, async Select ve System.Linq.Async paketiyle çakışmanın çözümü.
C# Async ve .NET 8: TimeProvider, ConfigureAwaitOptions, Parallel.ForAsync ve CancelAsync
.NET 6'da kendi IClock'umuzu yazıyorduk; .NET 8'de TimeProvider ve FakeTimeProvider ile 15 dakikalık bekleme testte 0 ms sürüyor. Exception fırlatmadan bekleyen SuppressThrowing ve Task<T> tuzağı, ForceYielding, index aralığını doğrudan alan Parallel.ForAsync ve callback'leri iptal edeni bekletmeden çalıştıran CancelAsync.
C# Timer'lar ve Bekleme: PeriodicTimer, WaitAsync ve Task.Delay
System.Threading.Timer'da üst üste binen callback'ler, .NET 6 PeriodicTimer ile çakışmasız periyodik iş, Thread.Sleep ile Task.Delay'in thread pool'a etkisi ve Task.Delay'in hassasiyeti, exception'ları yutan System.Timers.Timer, işlemi iptal etmeyen WaitAsync, backoff ve jitter ile retry, GC'nin topladığı timer.
C# Channels ile Producer/Consumer: Backpressure, Bounded Channel ve Pipeline
System.Threading.Channels ile async queue: kapasitesi iki olan channel'a neden üç sipariş sığıyor, Writer/Reader ve Complete, WaitToReadAsync/TryRead döngüsü, bounded channel'da FullMode seçenekleri ve itemDropped, birden çok consumer, hatayı Complete(ex) ile ileten bir sipariş pipeline'ı ve Complete'i unutmanın bedeli.