Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
C# Sürümleri: 1.0'dan 10'a Dilin Kısa Tarihi
C# 1.0'dan C# 10'a her sürümün imza özellikleri, çıkış tarihleri ve .NET eşleşmesi; aynı kodu farklı LangVersion değerleriyle derleyip compiler'ın hangi özelliğin hangi sürümden geldiğini nasıl söylediğini görmek.
C#'ta Unit Test: xUnit, Theory/InlineData ve Test Edilebilir Kod
Flaky bir testin sebebi olan gizli bağımlılıklar, xUnit test projesi, Fact ve Assert, Theory/InlineData/MemberData, zamanı IClock ile dışarıdan almak ve decimal InlineData, async void gibi tuzaklar.
C#'ta Dependency Injection Temelleri: Lifetime'lar, Container ve Captive Dependency
Microsoft.Extensions.DependencyInjection ile constructor injection, singleton/scoped/transient farkı, container'ın dispose sorumluluğu, captive dependency ve ValidateScopes, çoklu registration, TryAdd ve factory'ler.
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ı.
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 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 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 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.