C# Dokümantasyonu
Kısa ve örneklerle anlatılan C# kaynağı. Kavramı oku, kodu gör, sonra Coddy yolculuğunda uygula.
Rehberli bir C# yolculuğuna başlaBaşlarken
- NedirC#, Microsoft'un .NET üzerinde çalışan, statik tipli ve genel amaçlı dilidir. Ne için kullanıldığını, .NET ile ilişkisini, her sürümün neler eklediğini ve bir C# programının nasıl kurulduğunu öğrenin.
- Hello WorldSatır satır ilk C# programınız: Main metodu, Console.WriteLine ve Write, Console.ReadLine ile girdi okuma, yorumlar, dotnet CLI ile proje oluşturup çalıştırma ve top-level statements.
- C# vs JavaC# ve Java birbirine benzer ve benzer sorunları çözer. Asıl farklar property'lerde, değer tiplerinde, generics'te, LINQ ile stream'lerde, async'te, istisnalarda ve çevrelerindeki ekosistemlerdedir. Kodla yan yana bir karşılaştırma.
- C# vs C++C# çöp toplayıcılı, yönetilen bir dildir; C++ yerel koda derlenir ve bellek üzerinde elle kontrol verir. Bu farkın güvenlikte, performansta, oyun motorlarında, derleme modelinde ve öğrenme zorluğunda nasıl ortaya çıktığını görün.
- Namespace ve usingC# namespace'lerinin tipleri nasıl düzenlediği ve using yönergesinin onları nasıl içe aktardığı: alias'lar, using static, tam nitelikli adlar, belirsiz referansları düzeltmek, global using'ler ve dosya kapsamlı namespace'ler.
Temeller
- DeğişkenlerC#'ta değişkenleri bildirmek ve değer atamak, var'ın ne zaman iyi fikir olduğu ve ne zaman olmadığı, kapsamın nasıl çalıştığı, const, readonly ve static readonly arasındaki fark, adlandırma kuralları ve atanmamış değişken hatası.
- Veri TipleriBoyutu, aralığı ve literal son ekiyle her yerleşik C# tipi, değer tipleri ile referans tipleri arasındaki fark, para için neden decimal kullanıldığı, tamsayı taşması ve checked, varsayılan değerler.
- String'i Int'e ÇevirmeC#'ta bir string'i int.Parse, int.TryParse ve Convert.ToInt32 ile int'e çevirmek, örtük ve açık cast'lerin nasıl çalıştığı, bir double'ı cast etmenin neden kestiği, as ve is operatörleri ve "1.5"'in neden 15 olarak okunabildiği.
- OperatörlerC# operatörleri ve tam davranışları: tamsayı bölmesi, negatif sayılarla mod operatörü, artırma ve bileşik atama, karşılaştırma, kısa devre mantık, bitsel operatörler, null operatörleri ve bir öncelik tablosu.
- String'lerC#'ta string'lerin çalışma şekli: değiştirilemezlik, Length ve indeksleme, ==, Equals ve string.Compare ile karşılaştırma, kaçış karakterleri, verbatim @ string'ler ve çok satırlı metin, ham string literal'leri, null ve boş kontrolleri ve karakterler üzerinde döngü.
- SubstringC#'ta String.Substring nasıl çalışır: başlangıç indeksi ve uzunluk argümanları, ArgumentOutOfRangeException ve ondan kaçınmak, IndexOf sonuçları etrafındaki metni almak, ilk ya da son n karakteri almak ve C# 8'deki aralık operatörü.
- String InterpolationC#'ta $"..." string interpolation nasıl çalışır: süslü parantez içindeki ifadeler, F2, N0, C, D5 ve X gibi biçim belirteçleri, tablolar için hizalama, süslü parantezleri kaçırmak, string.Format ve bileşik biçimlendirme, verbatim ve ham interpolated string'ler ve belirli bir kültür için biçimlendirme.
- String MetotlarıC#'ta her gün kullandığınız String metotları: birkaç ayırıcı ve seçenekle Split, Replace, Contains ve harf duyarsız arama, IndexOf ve LastIndexOf, StartsWith ve EndsWith, Trim, ToUpper ve ToLower, PadLeft, Join, Concat ve bir string'i ters çevirmek.
- StringBuilderC#'ta bir döngüde tekrar tekrar string birleştirmenin neden yavaş olduğu ve StringBuilder'ın bunu nasıl düzelttiği: Append, AppendLine, AppendFormat, Insert, Remove, Replace, kapasite ve düz birleştirmenin ya da string.Join'in ne zaman daha iyi seçim olduğu.
- Rastgele SayılarC#'ta Random sınıfıyla rastgele sayı üretmek: Next ve dahil olmayan üst sınırı, bir aralıkta rastgele double'lar, tekrarlanabilir sonuçlar için seed'ler, rastgele bir eleman seçmek, bir listeyi karıştırmak, döngüde new Random tuzağı ve kriptografik olarak güvenli sayılar.
- DateTimeC#'ta tarih ve saatlerle çalışmak: DateTime değerleri oluşturmak, Now, UtcNow ve Today farkı, gün ve ay eklemek, çıkararak bir TimeSpan elde etmek, TotalHours ve Hours farkı, tarihleri karşılaştırmak, DayOfWeek, ParseExact ve TryParse ile parse etmek, DateTimeOffset ve DateOnly.
- DateTime FormatC#'ta bir DateTime'ı string olarak biçimlendirmek: standart biçim string'leri (d, D, o, s, u, t), yyyy-MM-dd HH:mm:ss gibi özel desenler, tam bir belirteç tablosu, kültürün çıktıyı nasıl değiştirdiği, "o" ile ISO 8601 gidiş dönüş ve mm ile MM, hh ile HH hataları.
Akış kontrolü
- if elseC#'ta if, else if ve else nasıl çalışır: koşulların neden bool olması gerektiği, testleri &&, || ve ! ile birleştirmek, süslü parantezlerin ne zaman önemli olduğu, derin iç içelik yerine koruma cümleleri ve = ile == ile başıboş noktalı virgül hataları.
- switch caseC# switch ifadesi nasıl çalışır: int, string, char ve enum değerleri üzerinde switch, her case'in neden break gerektirdiği (CS0163 hatası), birkaç değer için case etiketlerini üst üste koymak, goto case, default, string'lerde harf duyarlılığı ve when ile desen case etiketleri.
- switch ExpressionC# 8 switch expression, case ve break yerine desen kollarıyla bir değeri bir sonuca çevirir. Sözdizimi, _ discard'ı, property, tuple ve ilişkisel desenler, and/or/not, when korumaları, kapsayıcılık uyarıları ve SwitchExpressionException, çalıştırılabilir C# 7 karşılıklarıyla.
- Ternary OperatörüC# koşul operatörü condition ? a : b iki değerden birini seçer. Nasıl değerlendirildiği, iki dalın neden ortak bir tipe ihtiyaç duyduğu (CS0173) ve bunu düzelten cast, iç içe ternary'ler, string interpolation'da parantezler ve ?? ile ?.'nın ne zaman daha iyi ifade ettiği.
- for DöngüsüC# for döngüsü nasıl çalışır: başlatıcı, koşul ve yineleyici, geriye saymak ve adım atlamak, birkaç döngü değişkeni, dizilerde indeksle dolaşmak, iç içe döngüler, for(;;) ve bir fazla/eksik ile dolaşırken silme hataları.
- foreach DöngüsüC#'ta foreach nasıl çalışır: diziler, listeler, string'ler ve dictionary'ler (KeyValuePair ve deconstruction) üzerinde döngü, indeksi almak, döngü değişkeninin neden salt okunur olduğu, "Collection was modified" InvalidOperationException'ı ve çözümleri ve bir tipin foreach'te kullanılabilmesi için neye ihtiyacı olduğu.
- while DöngüsüC#'ta while ve do-while döngüleri nasıl çalışır: gövdeden önce ya da sonra kontrol edilen koşul, bir bitiş kelimesine ya da girdinin sonuna kadar okumak, break ile while (true) ve insanları yanıltan sonsuz döngü hataları.
- break ve continueC#'ta break, continue ve goto nasıl çalışır: bir döngüyü erken bitirmek, bir yinelemeyi atlamak, switch içinde break, iç içe döngülerden çıkmanın üç yolu (bayrak, goto ya da return içeren bir metot) ve while içinde continue sonsuz döngü hatası.
Metotlar ve delegeler
- MetotlarC#'ta metot bildirmek ve çağırmak: dönüş tipleri ve void, parametreler, expression-bodied metotlar, bir tuple ile birkaç değer döndürmek, overloading, params dizileri, statik ve örnek metotlar, Main metodu, özyineleme ve yerel fonksiyonlar.
- İsteğe Bağlı ParametrelerC#'ta isteğe bağlı parametreler ve adlandırılmış argümanlar nasıl çalışır: varsayılan değerler ve derleme zamanı sabiti kuralı, parametre sırası, argümanları adla atlamak, isteğe bağlı parametreler ile overload'lar, çağıran bilgisi öznitelikleri ve çağırana gömülen varsayılanların sürüm tuzağı.
- ref ve outC#'ta ref, out ve in parametreleri nasıl çalışır: kopya yerine değişkenin kendisini geçirmek, ek sonuçlar için out ve TryParse kalıbı, out var, salt okunur in parametreleri, kesin atama kuralları ve argüman bir referans tipi olduğunda neyin değiştiği.
- Lambda İfadeleriC#'ta lambda ifadeleri nasıl çalışır: tüm biçimleriyle => sözdizimi, lambda'ları Func ve Action içinde saklamak, onları metotlara ve LINQ'e geçirmek, deyim lambda'ları, yakalanan değişkenler üzerinde closure'lar ve foreach'te olmayan for döngüsü yakalama hatası.
- DelegelerC#'ta delegate nedir ve nasıl kullanılır: bir delegate tipi bildirmek, onu bir metottan, bir lambda'dan ya da anonim bir metottan oluşturmak, çağırmak, callback olarak delegeler, += ve -= ile multicast delegeler, ?.Invoke ile null kontrolü ve delegelerin Func, Action ve event'lerle ilişkisi.
- Func ve ActionC#'ta Func ve Action nasıl çalışır: değer döndüren fonksiyonlar için Func<T, TResult>, döndürmeyenler için Action<T>, Predicate ve Comparison, fonksiyon geçirmek ve döndürmek, bir komut dictionary'si, async lambda'lar ve bunun yerine ne zaman kendi delegate'inizi bildirmeniz gerektiği.
- Event'lerC#'ta event'ler nasıl çalışır: EventHandler ve EventHandler<T> ile bir event bildirmek, özel EventArgs sınıfları, += ve -= ile abone olmak ve aboneliği bırakmak, bir event'i ?.Invoke ile güvenle tetiklemek, bir event'in neden public bir delegate alanından iyi olduğu ve unutulmuş bir abonelik iptalinin yol açtığı bellek sızıntısı.
- Extension MetotlarC#'ta extension metotlar nasıl çalışır: ilk parametresinde this olan, statik bir sınıftaki statik bir metot, onu bir örnek metodu gibi çağırmak, string'i, enum'ları ve IEnumerable<T>'yi genişletmek, LINQ'in onlardan nasıl kurulduğu, örnek metotların neden kazandığı, null alıcılar ve ihtiyaç duydukları using yönergesi.
Koleksiyonlar ve LINQ
- DizilerBir C# dizisi, tek tipte elemanlardan oluşan sabit boyutlu bir bloktur. Dizileri tanımlamayı ve başlatmayı, Length'i okumayı, Array sınıfıyla sıralamayı ve aramayı, onları güvenle kopyalamayı ve 2D ile jagged dizilerle çalışmayı öğrenin.
- ListList<T>, C#'ın büyüyebilen dizisidir. Bir liste oluşturmayı, öğe eklemeyi ve araya eklemeyi, değere, indekse ya da koşula göre silmeyi, Contains ve Find ile aramayı, bir property'ye göre sıralamayı ve foreach içinde listeyi değiştirmenin yol açtığı hatadan kaçınmayı öğrenin.
- DictionaryDictionary<TKey, TValue> anahtarları hızlı aramayla değerlere eşler. Girdi eklemeyi ve güncellemeyi, TryGetValue ile güvenle okumayı, KeyValuePair girdilerini dolaşmayı, tekrarları saymayı, anahtarlarda harf büyüklüğünü yok saymayı ve SortedDictionary ile anahtarları sıralı tutmayı öğrenin.
- HashSetHashSet<T> benzersiz öğeler tutar ve Contains'i sabit zamanda cevaplar. Add'in tekrarları nasıl bildirdiğini, bir listeden tekrarları nasıl sileceğinizi, kümeleri nasıl birleştirip kesiştireceğinizi ve çıkaracağınızı ve bir kümenin kendi nesnelerinizi değere göre nasıl karşılaştıracağını öğrenin.
- QueueQueue<T> ilk giren ilk çıkar (FIFO) koleksiyonudur: öğeler geldikleri sırayla çıkar. Enqueue, Dequeue ve Peek'i, boş kuyruk istisnasını ve TryDequeue'yu, bir kuyrukla genişlik öncelikli aramayı ve ne zaman ConcurrentQueue ya da PriorityQueue'ya başvurulacağını öğrenin.
- StackStack<T> son giren ilk çıkar (LIFO) koleksiyonudur: en son eklenen öğe ilk çıkar. Push, Pop ve Peek'i, boş stack istisnasını ve TryPop'u, bir stack'in neden ters sırada dolaşıldığını ve iki klasik kullanımı öğrenin: bir geri alma geçmişi ve dengeli parantez kontrolü.
- Tuple'larBir C# tuple'ı, bir tip bildirmeden birkaç değeri tek bir değerde toplar. Value tuple sözdizimini, adlandırılmış elemanları, bir metottan birden fazla değer döndürmeyi, var (a, b) ile ayrıştırmayı, bir dictionary'de tuple anahtarlarını ve ValueTuple'ın eski System.Tuple'dan farkını öğrenin.
- LINQLINQ, C#'taki her koleksiyona sorgu operatörleri ekler. Metot sözdizimini ve sorgu sözdizimini, Where ile filtrelemeyi, Select ile projeksiyonu, OrderBy ve ThenBy ile sıralamayı, GroupBy ile gruplamayı, First ile FirstOrDefault tuzağını, toplama işlemlerini ve ertelenmiş yürütmenin sorgunuzun ne zaman çalıştığını nasıl değiştirdiğini öğrenin.
- IEnumerable ve yieldIEnumerable<T>, foreach ve LINQ'in arkasındaki interface'tir; yield return ise onu uygulamanın en kolay yoludur. IEnumerable'ın ICollection ve List ile ilişkisini, bir iterator metodunun adım adım nasıl çalıştığını, yield break'i, sonsuz dizileri ve tembel değerlendirmenin tuzaklarını öğrenin.
Sınıflar ve tipler
- Sınıflar ve NesnelerC#'ta bir sınıf bildirmek, ona alanlar ve metotlar vermek, new ile nesne oluşturmak ve bir sınıfın referans tipi olmasının ne anlama geldiği: paylaşılan nesneler, null ve NullReferenceException, ToString ve nesne başlatıcılar.
- Constructor'larC# constructor'ları nasıl çalışır: örtük varsayılan constructor ve ne zaman ortadan kalktığı, parametreli ve overload edilmiş constructor'lar, this(...) ve base(...) ile zincirleme, işlerin çalışma sırası, statik ve private constructor'lar ve C# 12 birincil constructor'ları.
- Property'lerC# property'leri nasıl çalışır: bir arka plan alanı üzerinde get ve set erişimcileri, auto-property'ler, private set ve yalnızca get içeren property'ler, hesaplanan property'ler, setter'larda doğrulama ve C# 9 ile 11'deki init ve required anahtar kelimeleri.
- static Anahtar KelimesiC#'ta static ne demek: bir nesne yerine tipe ait üyeler, örnekler arasında paylaşılan durum, statik metotlar ve statik sınıflar, statik constructor'lar, const ile static readonly, using static ve CS0120 hatası.
- Erişim BelirleyicilerC#'ın altı erişim belirleyicisi (public, private, protected, internal, protected internal, private protected), her birinin neye izin verdiği, hiçbirini yazmadığınızda geçerli olan varsayılanlar ve ürettikleri derleyici hataları.
- KalıtımC#'ta sınıf kalıtımı nasıl çalışır: iki nokta ile türetmek, neyin kalıtıldığı ve neyin kalıtılmadığı, base ile temel sınıfı çağırmak, virtual ve override, new ile gizlemek (ve herkesi şaşırtan çıktı), sealed, polimorfizm ve bir hiyerarşide yukarı ve aşağı cast.
- Abstract SınıflarC#'ta abstract sınıf nedir: örneklenemeyen ve türetilmiş sınıflarının uygulaması gereken abstract üyeler bildirebilen bir temel sınıf. Abstract metotlar ve property'ler, constructor'lar, şablon metot kalıbı ve bunun yerine ne zaman interface seçileceği.
- Interface'lerC#'ta interface'ler nasıl çalışır: bir interface bildirmek, onu sınıflarda ve struct'larda uygulamak, interface'i tip olarak kullanmak, aynı anda birkaçını uygulamak, açık uygulama, en çok uygulayacağınız framework interface'leri (IComparable<T>, IEnumerable<T>, IDisposable) ve C# 8 varsayılan interface metotları.
- Struct'larC#'ta struct'lar nasıl çalışır: değer semantiği ve atamada kopyalama, List<T> değiştirme hatası, constructor kuralları, eşitlik, boxing, readonly struct ve record struct, ayrıca bir struct'ın ne zaman doğru seçim olduğuna dair rehberlikle struct ve class karşılaştırması.
- Enum'larC#'ta enum'lar nasıl çalışır: adlandırılmış sabitler bildirmek, alttaki tamsayı değerleri ve cast, Parse ve TryParse ile enum'u string'e ve string'i enum'a çevirmek, tüm değerleri listelemek, bitsel operatörler ve HasFlag ile [Flags], enum üzerinde switch ve tanımsız değerleri ele almak.
- Record'larC# record'ları nedir (C# 9 ve sonrası): konumsal sözdizimi, derleyicinin ürettiği üyeler, değere dayalı eşitlik, with ile yıkıcı olmayan kopyalar, yerleşik ToString, C# 10'dan record struct, record'lar arasında kalıtım ve elle yazılmış eşdeğer sınıf.
- GenericsC#'ta generics nasıl çalışır: tip parametreleriyle generic sınıflar ve metotlar yazmak, tip çıkarımı, where ile kısıtlar (class, struct, new(), temel sınıflar, interface'ler), default(T), tip başına statik üyeler ve IEnumerable<out T> ile kovaryans.
- Nullable TiplerC#'ta null hakkında her şey: HasValue, Value ve GetValueOrDefault ile nullable değer tipleri (int?, Nullable<T>), null birleştirme operatörleri ?? ve ??=, null koşullu operatör ?., null kontrolleri ve C# 8'deki nullable referans tipleri (string?).
- Pattern MatchingC#'ta pattern matching nasıl çalışır: tip ve sabit desenleriyle is operatörü, case desenleri ve when ile switch ifadeleri, switch expression'lar, property, tuple ve konumsal desenler, ilişkisel ve mantıksal desenler (and, or, not), liste desenleri ve her birini hangi C# sürümünün eklediği.
İstisnalar
- Try Catchtry, catch ve finally, C#'ın istisnaları ele alma yoludur. Bir istisnanın çağrı yığınında nasıl yukarı çıktığını, belirli istisna tiplerini doğru sırayla yakalamayı, when ile filtrelemeyi, finally'de temizlik yapmayı, stack trace'i kaybetmeden throw; ile yeniden fırlatmayı ve hangi istisnaların yakalanmaması gerektiğini öğrenin.
- İstisna FırlatmakC#'ta istisnalar nasıl ve ne zaman fırlatılır. throw ifadesini, hangi yerleşik istisna tipinin hangi hataya uyduğunu, ?? ve ?: ile throw ifadelerini, ThrowIfNull yardımcılarını ve kendi verisi ve bir inner exception'ı olan özel bir istisna sınıfının nasıl yazılacağını öğrenin.
- using İfadesiusing ifadesi, bir istisna fırlatılsa bile dosyalarda, stream'lerde, bağlantılarda ve diğer IDisposable nesnelerde Dispose'un çağrılmasını garanti eder. Neye derlendiğini, nesnelerin hangi sırayla dispose edildiğini, C# 8 using bildirimini ve kendi sınıfınızda IDisposable'ın nasıl uygulanacağını öğrenin.
Asenkron ve iş parçacıkları
- Async Awaitasync ve await, C# kodunun bir thread'i bloklamadan yavaş işlemleri beklemesini sağlar. Bir async metodun nasıl çalıştığını, Task ve Task<T>'yi, Task.WhenAll ile bağımsız işlemleri aynı anda çalıştırmayı, async kodda istisnaları ve async void ile .Result'ın neden hatalara ve deadlock'lara yol açtığını öğrenin.
- Task'larTask, .NET'te asenkron ve paralel işin birimidir. CPU'ya bağlı iş için Task.Run'ı, sonuçları okumayı, task'ları WhenAll ve WhenAny ile birleştirmeyi, devamları, CancellationToken ile iptali, bir Task'ın bir Thread'den farkını ve Parallel.For'un ne zaman daha uygun olduğunu öğrenin.
- Locklock ifadesi, bir kod bloğunu aynı anda yalnızca bir thread'in çalıştırmasına izin verir. Bir yarış durumunun bir sayacı bozduğunu görün, onu lock ile düzeltin, hangi nesne üzerinde lock yapılacağını öğrenin, basit sayaçlar için Interlocked kullanın, lock sırasından kaynaklanan deadlock'lardan kaçının ve içerideki kod await ettiğinde SemaphoreSlim kullanın.
- TimerC#'ta birkaç timer sınıfı vardır ve farklı davranırlar. System.Threading.Timer, System.Timers.Timer, PeriodicTimer ya da bir UI timer'ının ne zaman kullanılacağını, onları nasıl başlatıp durduracağınızı, callback'lerin neden thread pool'da çalışıp üst üste binebildiğini, bir timer'a neden referans verilmeye devam edilmesi gerektiğini ve Stopwatch ile geçen sürenin nasıl ölçüleceğini öğrenin.
Dosyalar, JSON ve fazlası
- Dosya Okuma ve YazmaC#'ta bir dosyaya yazmak ve bir dosyayı okumak: tüm dosyalar için File.WriteAllText, ReadAllText, AppendAllText, WriteAllLines ve ReadAllLines, büyük dosyalar için StreamWriter ve StreamReader, Path.Combine ile yollar, klasörler, kodlamalar ve dosya kodunun ele alması gereken istisnalar.
- JSONC#'ta System.Text.Json ile JSON'la çalışmak: JsonSerializer.Serialize ve Deserialize, camelCase ve girintili çıktı, JsonPropertyName ve JsonIgnore gibi öznitelikler, string olarak enum'lar, JsonDocument ve JsonNode ile sınıfsız JSON okumak, hatalar ve Newtonsoft.Json ile karşılaştırması.
- RegexC#'ta System.Text.RegularExpressions ile düzenli ifadeler kullanmak: IsMatch, Match ve Matches, numaralı ve adlandırılmış gruplar, yerine koymalar ve bir lambda ile Replace, Split, RegexOptions, verbatim desen string'leri, girdi doğrulama, zaman aşımları ve .NET 7 GeneratedRegex özniteliği.
- Reflection ve ÖzniteliklerC#'ta reflection nasıl çalışır: typeof ve GetType'tan Type nesneleri, property okumak ve ayarlamak, metotları adıyla çağırmak, örnek oluşturmak ve öznitelikler: Obsolete gibi yerleşik olanlar, kendinizinkini bildirmek ve onları çalışma zamanında okumak. Ayrıca reflection'ın maliyeti.