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.
| Tip | Açıklama |
|---|---|
| int, long, short | Tam sayı tipleri (değer tipi) |
| double, float, decimal | Ondalıklı sayılar |
| string | Karakter dizisi (referans tipi, immutable) |
| struct | Küçü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
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.