C# EĞİTİMİ
C# eğitimi, dili sadece söz dizimi olarak değil .NET runtime'ını anlayarak kullanan bir mühendis yetiştirir. Nullable reference type, record, pattern matching ve init-only property gibi modern özellikler ürün koduna nasıl yedirilir sorusu somut örneklerle işlenir. async/await'i Task ve ValueTask ayrımıyla performanslı yazma alışkanlığı kazandırılır.
Program sonunda katılımcı, LINQ'i deferred execution ve N+1 tuzaklarını bilerek yazar; IEnumerable, IAsyncEnumerable ve IQueryable arasında doğru tipi seçer. Source generator ile boilerplate'i build-time'a taşıma ve BenchmarkDotNet ile mikro-benchmark eğitimin temelini oluşturur. Eğitim materyalleri C# dil belgeleri ile uyumlu hazırlanmıştır.
Katılımcı Profili
Bu eğitim, .NET runtime'ını ve modern C# özelliklerini birlikte kullanmak isteyen rollere yöneliktir:
- .NET Geliştiriciler: Modern C# (nullable, record, pattern matching) kullanan mühendisler
- Backend Mühendisleri: ASP.NET Core ile API ve servis yazan ekipler
- Oyun Geliştiriciler: Unity ile C# kullanan game developer'lar
- Migration Ekipleri: .NET Framework'ten .NET'e geçiş yapan roller
- Solution Architect'ler: .NET tarafında çözüm mimarisi tasarlayanlar
Ön Gereklilikler
Bu eğitime katılım için aşağıdaki ön bilgiler önerilir:
- Herhangi bir dilde temel OOP (class, method, inheritance) deneyimi
- Visual Studio veya VS Code kullanım deneyimi
- Komut satırı (dotnet CLI) ile temel rahatlık
- Git ile sürüm kontrol kullanımı (clone, commit, branch)
- Temel HTTP ve JSON kavramlarına aşinalık
Süresi ve Tarihi
Süre: 4 gün. Bu süre standart program içindir; ek modüllere ve hedefe göre süre özelleştirilebilir.
Eğitim tarihleri ve saatleri, ekibinizin uygunluğuna göre birlikte planlanır.
Kazanımlar
Eğitim sonunda katılımcı, C#'ı sadece dil olarak değil, .NET runtime'ını anlayarak kullanır:
- Nullable reference type ile null sızıntısını compile-time'a alır
- async/await'i Task ve ValueTask ayrımıyla performanslı yazar
- LINQ'i deferred execution ve N+1 tuzaklarını bilerek kurar
- IEnumerable, IAsyncEnumerable ve IQueryable arasında doğru tip seçer
- Record, init-only property ve pattern matching ile immutable model tasarlar
- Source generator ile boilerplate'i build-time'a taşır
- BenchmarkDotNet ile mikro-benchmark yapar, regresyon tespit eder
C# Eğitimi Konuları
1. C# ve .NET - Modern Ekosistem
- .NET birleşimi: Framework, Core ve modern .NET yolu
- dotnet CLI ile proje üretimi ve build akışı
- Visual Studio, VS Code ve Rider seçimi
- Cross-platform deploy: Windows, Linux, macOS
2. Söz Dizimi ve Temel Tipler
- Value ve reference type ayrımı
- string, char, sayı tipleri ve sınırları
- Top-level statement ve file-scoped namespace
- String interpolation ve raw string literal
- Tuple, deconstruction ve ValueTuple
3. var, dynamic ve Type Inference
- var ile statik tip çıkarımı (compile-time)
- dynamic ile runtime dispatch ve maliyeti
- Implicit ve explicit cast kuralları
- Boxing/unboxing performans etkisi
4. Akış Kontrolü ve Pattern Matching
- if, switch, for, while, foreach
- switch expression ve pattern matching
- Property pattern ve recursive pattern
- is ve as operatörleri
- List pattern ve range pattern
5. Methods, Delegates ve Events
- Method imzası, ref, out, in parametreleri
- Optional ve named argument
- Extension method yazımı
- Delegate, Func, Action, Predicate
- Event ve EventHandler pattern
6. Class, Struct ve Record
- Class (reference) ve struct (value) farkı
- Record ile immutable veri modeli
- Record struct ve performans
- with expression ile non-destructive mutation
- Sealed class ve performans etkisi
7. OOP - Inheritance, Interface, Abstract
- Single inheritance ve interface composition
- Abstract class ve default interface method
- virtual, override, sealed, new modifier'lar
- Polymorphism ve dynamic dispatch
- Composition over inheritance prensibi
8. Property, Init-Only ve Auto-Property
- Auto-implemented property ve backing field
- init accessor ile immutable initialization
- required modifier (constructor zorunluluk)
- Computed property ve expression-bodied member
9. Nullable Reference Types
- Nullable reference type (NRT) ve compile-time uyarı
- ? işareti ile niyet bildirimi
- ! null-forgiving operator riski
- Null coalescing (??), null-conditional (?.)
- NRT migration: #nullable enable/disable
10. Generics ve Constraint
- Generic class, method ve interface
- Constraint: where T : class, struct, new(), interface
- Covariance ve contravariance
- Generic ile boxing önleme
11. Collection Framework
- List<T>, Dictionary<K,V>, HashSet<T> seçimi
- IEnumerable, ICollection, IList hiyerarşisi
- ReadOnlyCollection ve immutable koleksiyonlar
- Concurrent collections: ConcurrentDictionary, ConcurrentBag
- Collection expression ([1,2,3]) söz dizimi
12. LINQ - Deferred Execution
- Method ve query syntax
- Where, Select, GroupBy, Join, Aggregate
- Deferred execution ve multiple enumeration tuzağı
- Expression<Func<T>> ve LINQ to SQL/EF Core
- IQueryable ve IEnumerable arasındaki sınır
13. async/await - Threading Modeli
- Task ve Task<T> tabanlı asenkron model
- async/await söz dizimi ve state machine üretimi
- Task.Run, Task.WhenAll, Task.WhenAny
- ValueTask ile allocation azaltma
- IAsyncEnumerable ile async stream
14. ConfigureAwait ve SynchronizationContext
- SynchronizationContext nedir, nerede önemli
- ConfigureAwait(false) ile context capture bypass
- UI thread vs library kod farkı
- Deadlock pattern: .Result, .Wait() tuzağı
- CancellationToken ile iptal yönetimi
15. Exception Handling - try/catch/finally ve using
- try, catch, finally ve filter (when) kullanımı
- Exception hiyerarşisi ve özelleştirme
- throw vs throw ex (stack trace koruma)
- Custom exception sınıfı tasarımı
- Hata kodu ve exception arasında seçim
16. IDisposable, using ve Resource Pattern
- IDisposable arayüzü ve Dispose pattern
- using statement ve using declaration
- IAsyncDisposable ile asenkron temizlik
- Finalizer (~) ve GC etkileşimi
- SafeHandle ile native kaynak sarmalama
17. Reflection ve Attribute
- Type, MethodInfo, PropertyInfo reflection API'si
- Custom attribute tanımı ve okuma
- Activator.CreateInstance ile dinamik yaratım
- Performans maliyeti ve cache stratejisi
18. Span<T>, Memory<T> - Allocation-Free
- Span ile stack-allocated bellek dilimi
- Memory ile heap dilimi (async kullanım)
- String parsing'de allocation azaltma
- ArrayPool ve buffer yeniden kullanım
19. Source Generator
- Compile-time kod üretimi mantığı
- System.Text.Json, Logging gibi yerleşik generator'lar
- Incremental generator ve performans
- Roslyn analyzer ile entegrasyon
20. NuGet ve Paket Yönetimi
- NuGet.org ve özel feed yapılandırması
- Central Package Management (Directory.Packages.props)
- Floating version ve risk yönetimi
- Vulnerable package tespiti (dotnet list package --vulnerable)
21. CLR, IL ve JIT
- CLR (Common Language Runtime) görevleri
- IL (Intermediate Language) ve disassembly
- JIT (Just-In-Time) ve AOT (Ahead-Of-Time) derleme
- Garbage Collector: nesil, LOH, Server GC
- ReadyToRun ve startup optimizasyonu
22. File I/O ve Streams
- File, Directory, Path statik sınıfları
- FileStream, MemoryStream, NetworkStream
- StreamReader/Writer ve encoding
- System.Text.Json ile JSON serileştirme
- Async I/O ile büyük dosya işleme
C# EĞİTİMİ ile İlgili
Sıkça Sorulan Sorular ve Cevapları
Nullable reference type compile-time'da neyi yakalar?
Reference tipler default olarak null kabul ederken NRT açılınca her referans tipinin null kabul edip etmediği tipte deklare edilir (string? vs string). Olası null dereference compile warning olarak çıkar. Eski codebase'de aşamalı aktive etmek için #nullable enable directive ve project-level flag birlikte kullanılır.
Task ile ValueTask arasındaki fark ne zaman önemli olur?
Task heap'te allocate edilir; her async metod çağrısı GC yükü oluşturur. ValueTask cache veya senkron path için struct olarak döner — sık çağrılan ve genelde senkron biten metodlarda allocation kazanımı sağlar. Yanlış kullanımda ValueTask'i await dışında tekrar tüketmek runtime exception verir.
LINQ deferred execution ile N+1 tuzakları nasıl önlenir?
LINQ to Entities sorgusu Iterate edilene kadar database'e gitmez; Include eksikse navigation property erişimi her satırda ek query çıkarır. Çözüm: Include ve ThenInclude ile eager load, ya da Select projection ile sadece gereken kolonları tek query'e indirme. EFCore.Diagnostics.QueryLogging tuzakları yakalar.
IEnumerable, IAsyncEnumerable ve IQueryable arasında nasıl seçim yapılır?
IEnumerable in-memory koleksiyon; LINQ to Objects. IQueryable expression tree ile remote query (EF Core, OData) — provider sorguyu çevirir. IAsyncEnumerable yield-based asenkron stream (await foreach). Database streaming için IAsyncEnumerable + EF Core 7+ büyük result set'i bellek dolduramadan akıtır.
Record ve init-only property ne zaman tercih edilir?
Record immutable value object için ideal — primary constructor, value equality ve with expression (kopya ile modifiye) hazır gelir. Class init-only property ise immutable ama davranış-odaklı tipler için doğru. DTO ve domain value type için record, behavior'lı domain entity için class tercih edilir.
Source generator boilerplate'i nasıl build-time'a taşır?
Source generator Roslyn compiler eklentisi olarak çalışır; mevcut kodu okur ve build sırasında yeni C# dosyaları üretir. JSON serializer, mapper, DI container kayıtları runtime reflection yerine compile-time'da üretilir — startup ve memory kazancı sağlar. System.Text.Json source generation klasik örnektir.



