Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
C# Generics Neden Var: ArrayList, Boxing ve Tip Güvenliği
ArrayList'in her şeyi object olarak saklamasının bedeli: runtime'a kayan InvalidCastException, value type'larda boxing ve sekiz kat bellek. List<T> ile tip güvenliği, runtime'ın generic tipleri nasıl gördüğü ve eski collection'ları OfType/Cast ile generic dünyaya taşımak.
C# Generic Class, Generic Method ve Constraint'ler
Kendi generic class ve method'larını yazmak: Page<T> ile sayfalama, tip çıkarımının sınırları, default ve constraint'siz T? tuzağı. class, struct, new(), notnull, unmanaged ve Enum constraint'leri gerçek derleyici hatalarıyla; closed tip başına static ve generic kodda == tuzağı.
C# List<T> Rehberi: Ekleme, Silme, Capacity, Sıralama ve Arama
Döngüde silerken atlanan element'ler ve 'Collection was modified' hatası, RemoveAll ile doğru silme. İçerideki array, Capacity'nin 4-8-16-32 diye büyümesi ve EnsureCapacity; Add, Insert, Remove ve eşitlik, Find ailesi, Sort, BinarySearch ve Sort'un stable olmaması.
C# Dictionary ve HashSet: TryGetValue, Key Eşitliği ve Comparer
Dictionary bir key'i GetHashCode ve Equals ile nasıl bulur, eşitliği olmayan class key neden dictionary'yi şişirir. Add, indexer, TryAdd, TryGetValue farkları, .NET 6 CollectionsMarshal ile tek aramada sayma, değişen key tuzağı, OrdinalIgnoreCase ve Türkçe I tuzağı, sıra garantisi ve HashSet set işlemleri.
C# Queue, Stack, LinkedList ve PriorityQueue: Sırayla Çalışan Collection'lar
FIFO için Queue<T>, LIFO ve geri alma için Stack<T>, node'larla O(1) ekleme ve silme için LinkedList<T>, LinkedList ve Dictionary ile küçük bir LRU cache. .NET 6 PriorityQueue: UnorderedItems neden sırasız, eşit önceliklerde stable olmaması, sıra numarasıyla adil queue ve EnqueueDequeue ile en pahalı N kitap.
C# Sıralı Collection'lar: SortedList, SortedDictionary, SortedSet ve IComparer
Comparer sıfır döndürünce SortedSet'ten sessizce kaybolan kitap ve eşitlik bozucu ikinci kriter. Red-black tree üzerindeki SortedDictionary, iki sıralı array'li SortedList ve hangisinin ne zaman seçileceği; SortedSet ile Min, Max ve canlı GetViewBetween; IComparer, kültüre duyarlı string sırası ve bozuk comparer tuzakları.
C# Collection Interface'leri: IEnumerable, ICollection, IList ve yield return
IEnumerable, ICollection, IList ve IReadOnly* interface'leri neyi vaat eder, neyi etmez; array'in Add'de neden patladığı, iç listeyi güvenle dışarı açmak, parametre tipi seçmek ve yield return ile lazy iterator'ler yazmak.
C# Immutable Collection'lar ve Doğru Collection'ı Seçmek
Read-only view ile gerçek immutability farkı, ImmutableList'in structural sharing'i, builder'lar, ImmutableArray ile ImmutableList'in BenchmarkDotNet ile ölçülen farkı ve karmaşıklık haritasıyla doğru collection'ı seçmek.
C# Generic Variance: Covariance ve Contravariance (in ve out)
List<EBook> neden List<Book> olamaz ama IEnumerable<Book> olabilir? Array covariance'ın deliği, out ile covariance, in ile contravariance, delegate'lerde variance, kuralların sınırları ve CS0266'nın önerdiği cast tuzağı.
C# 11–12 ve .NET 7–8: Generic Math, Frozen ve Collection Expressions
C# 10'da yazılamayan generic toplama, static abstract member'lar ve INumber<T> ile generic math; bir kez kurulup çok okunan FrozenDictionary ve FrozenSet'in BenchmarkDotNet ölçümü; köşeli parantezli collection expression'lar, spread ve CollectionBuilder.
C# 13–14 ve .NET 9–10: OrderedDictionary, params Collections ve Fazlası
Dictionary'nin sıra sözü vermemesi ve .NET 9'un generic OrderedDictionary'si, .NET 10'un index döndüren TryAdd/TryGetValue'su, PriorityQueue.Remove, string ayırmadan alternate lookup, C# 13 params collections ve C# 14 extension members ile span dönüşümleri.