C# (C Sharp) — Çok Ayrıntılı Rehber

Temel kavramlardan ileri düzeye kadar örneklerle, açıklamalarla ve pratik ipuçlarıyla.

Tek dosya HTML - kaydet, aç, oku

Giriş & Tarihçe

C# Microsoft tarafından Anders Hejlsberg liderliğinde geliştirildi. .NET platformu için tasarlanmış, güçlü tipli, nesne yönelimli bir dildir. C# modern yazılım geliştirme ihtiyaçlarını karşılayacak şekilde evrimleşti: generics (C# 2.0), LINQ (C# 3.0), async/await (C# 5.0), record tipi (C# 9.0) gibi özellikler eklendi.

Temel Söz Dizimi

Basit bir "Hello World" uygulaması — .NET CLI ile çalıştırılabilir.

// Program.cs
using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");
    }
}

Derleyici ve Çalıştırma

.NET SDK kuruluysa terminalde:

dotnet new console -o MyApp
cd MyApp
dotnet run

Yorum satırları, bloklar ve isim uzayları

// Tek satır
/*
 Çok satırlı
*/
namespace Ornek.Uygulama {
    // sınıf burada
}

Tip Sistemi — Değer ve Referans Tipleri

C#'ta tipler iki ana gruptadır: değer tipleri (int, double, bool, struct) ve referans tipleri (class, interface, delegate, array). Değer tipleri stack'te veya inline tutulur; referans tipleri heap'te ve referansları stack'te tutulur.

TipAçıklama
int, long, shortTam sayı tipleri (değer tipi)
double, float, decimalOndalıklı sayılar
stringKarakter dizisi (referans tipi, immutable)
structKüçük veri paketleri için değer tipi

Nullable tipler

int? maybe = null; // Nullable
if (maybe.HasValue) Console.WriteLine(maybe.Value);

Pattern matching (örnek)

object o = 7;
if (o is int i) Console.WriteLine(i + 10);

NESNE YÖNELİMLİ PROGRAMLAMA (OOP)

C# OOP'i tam destekler: encapsulation, inheritance, polymorphism. Ayrıca interface'ler ve abstract sınıflar ile tasarım kalıpları kolayca uygulanır.

Sınıf örneği

public class Araba {
    public string Marka { get; set; }
    public int Yil { get; set; }

    public virtual void Calistir() {
        Console.WriteLine("Araba çalıştı.");
    }
}

public class ElektrikliAraba : Araba {
    public override void Calistir() {
        Console.WriteLine("Elektrikli araba sessizce çalıştı.");
    }
}

Interface kullanımı

public interface IYukleme {
    void Yukle();
}

public class USB : IYukleme {
    public void Yukle(){ Console.WriteLine("USB ile yükleniyor"); }
}

Generikler (Generics)

Generikler tür güvenliği sağlar ve yeniden kullanılabilirliği artırır. Koleksiyonlar, metodlar ve sınıflarda kullanılabilir.

public class Depo {
    private List icerik = new List();
    public void Ekle(T item) => icerik.Add(item);
    public T Al(int i) => icerik[i];
}

var d = new Depo();
d.Ekle("Merhaba");

Kontraint'ler

public class Fabrika where T : new() {
    public T Create() => new T();
}

Delegeler & Olaylar (Delegates & Events)

Delegeler metod referanslarını tutar; olaylar (events) publish/subscribe modelini sağlar.

public delegate void Bildirim(string msg);

public class Duyuru {
    public event Bildirim OnDuyuru;
    public void Yayınla(string m) => OnDuyuru?.Invoke(m);
}

// Kullanım
var d = new Duyuru();
d.OnDuyuru += (s)=> Console.WriteLine("Alındı: "+s);
d.Yayınla("Merhaba");

LINQ (Language Integrated Query)

LINQ koleksiyonları sorgulamak için güçlü, tip güvenli bir sözdizimi sunar. Hem sorgu ifadeleri (query syntax) hem de uzantı metotları (extension methods) kullanılabilir.

int[] values = {1,2,3,4,5};
var even = values.Where(x=>x%2==0).Select(x=>x*x);
foreach(var v in even) Console.WriteLine(v);

Örnek: grouping ve joining

var gr = people.GroupBy(p => p.City)
             .Select(g => new { City = g.Key, Count = g.Count() });

async / await & Asenkron Programlama

async/await ile asenkron kod yazmak senkron okumaya benzer bir akış sağlar. Task asenkron sonuçları temsil eder.

public async Task<string> DownloadAsync(string url){
    using var client = new HttpClient();
    return await client.GetStringAsync(url);
}

// çağırma:
var content = await DownloadAsync("https://example.com");

İpuçları

  • UI uygulamalarında async void yalnızca event handler'lar için uygundur.
  • Deadlock'a dikkat — ConfigureAwait(false) server kodunda faydalı olabilir.

Bellek Yönetimi & Çöp Toplayıcı (GC)

.NET'te bellek GC tarafından yönetilir. IDisposable ile unmanaged kaynakları serbest bırakın (using deseni veya using declaration önerilir).

using(var stream = File.OpenRead(path)){
    // kullan
}
// veya C# 8.0+
using var stream2 = File.OpenRead(path);

Heap vs Stack

Küçük, kısa ömürlü değer tipleri stack'te; büyük veya uzun ömürlü nesneler heap'te. Large Object Heap (LOH) 85KB üzeri nesneler için kullanılır.

İleri Konular

Record tipleri

public record Kisi(string Ad, string Soyad);
var k = new Kisi("Ahmet","Yılmaz");
var k2 = k with { Ad = "Mehmet" };

Pattern matching, switch ifadeleri

switch(obj)
{
  case Person p when p.Age >= 18: Console.WriteLine("Yetişkin"); break;
  case null: Console.WriteLine("Null") ; break;
}

Span<T> ve Memory<T>

Performans odaklı bellek dilimleri (stack veya unmanaged üzerine) için kullanılır, kopyaları azaltır.

En İyi Uygulamalar (Best Practices)

  • Null-safety: mümkün olduğunca nullable referans tiplerini ve analiz araçlarını kullanın.
  • İsimlendirme: PascalCase for public members, camelCase for local variables.
  • Dependency Injection kullanın — test edilebilirliği artırır.
  • Küçük, tek sorumluluklu sınıflar yazın (SRP).
  • Asenkron API'lerde Task-returning metodları tercih edin (async/await).

Kısa Özet & Kaynaklar

Bu dosya öğretici amaçlı hazırlanmıştır. Daha ileri öğrenme için .NET docs, C# language specification ve resmi rehberler tavsiye edilir.