Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
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#'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 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 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 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 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 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 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 ref return, ref local, in Parametreleri ve ref struct
Değeri kopyalamak yerine referansıyla taşımak: ref local, ref return, ref readonly, in parametrelerinde defensive copy tuzağı, readonly struct ve kendi ref struct tipini yazmak.
C#'ta Interop ve unsafe Kod: P/Invoke, Pointer'lar ve fixed
AllowUnsafeBlocks ve pointer'lar, fixed ile GC'ye karşı sabitlemek, DllImport ile libc çağırmak, string marshalling, function pointer ile callback, NativeMemory ve span ile unsafe kodu küçük tutmak.
C#'ta Source Generator: IIncrementalGenerator ile Compile Time'da Kod Üretmek
Derleme sırasında kod ekleyen bir incremental generator yazmak: netstandard2.0 projesi ve Roslyn sürümü, pipeline ve cache, üretilen kodu görmek, partial ve hint name tuzakları.
C#'ta Performans: Allocation, Struct'lar ve BenchmarkDotNet ile Ölçmek
Stopwatch'un neden yetmediği, BenchmarkDotNet 0.15.8 kurulumu ve tabloyu okumak, class ile struct'ın ölçülmüş farkı, boxing ve closure kaynaklı gizli allocation'lar ve benchmark tuzakları.