C# KODLARININ ANLAMLARI
Programlamaya yeni başlayan biri ilk C# dosyasını açtığında bir blok metne bakar ve şunu sorar: "Bu kelimelerin hepsi aynı şey mi?" Yaygın yanılgı budur — C# kodu tek bir bütün, tek bir "yazılım dili cümlesi" sanılır. Gerçek farklıdır. Tek bir .cs dosyasında en az altı farklı kategoriden kelime yan yana durur: kütüphane çağıran satırlar, yapıyı tanımlayanlar, davranışı belirleyenler, veri tutanlar, akışı yönlendirenler ve sembolik operatörler. Hangi kelimenin hangi göreve ait olduğunu ayırabildiğin anda C# kodu okumak birden okunaklı hale gelir.
Bu yazı, sık karşılaşılan C# kodlarını kategorilerine göre açıklar. Hedef bir kütüphane listesi vermek değil — geliştiricinin gördüğü kelimelerin hangi göreve hizmet ettiğini netleştirmektir. Microsoft'un resmi C# dokümantasyonu tüm syntax ayrıntısını barındırır; buradaki amaç ise zihinde kategori haritası kurmaktır.
C# Kodu Tek Bir Şey Değildir
Aşağıdaki klasik "Hello World" örneğini düşün:
using System;— bir kütüphaneyi çağıran satırnamespace MyApp— kodun ait olduğu grubu belirten satırclass Program— bir yapı taşı tanımlayan satırstatic void Main()— bir davranış (metot) tanımlayan satırConsole.WriteLine("Merhaba");— bir komut çalıştıran satır
Beş satır, beş farklı görev. Bunları aynı kefeye koymak yeni başlayanı boğar. Her birinin ne yaptığını ayrı ayrı çözünce kod yazmak yeniden ulaşılabilir hale gelir.
using ve namespace: Hangi Kütüphaneyi Çağırıyorsun
using kelimesi C#'a şunu söyler: "Bu dosyada şu kütüphanedeki sınıfları doğrudan adıyla çağıracağım, her seferinde uzun yolunu yazmayacağım." using System; yazdığında System.Console.WriteLine yerine sadece Console.WriteLine diyebilirsin. Performansa etkisi yoktur; sadece okunabilirlik içindir.
namespace ise senin yazdığın kodu bir kapsayıcıya koyar. Aynı isimde iki sınıf olabilir, ama farklı namespace'lerde durdukları için çakışmazlar. Büyük projelerde namespace ağacı modüller arası sınır görevi yapar.
Modern C# (.NET 6+) ile file-scoped namespace ve global using geldi — dosyaların başı temizlendi. Ama altta yatan kavram aynıdır: hangi kütüphaneye erişiyorsun, hangi gruba aitsin?
class, struct ve method: Yapı Taşları
C# nesne yönelimli bir dildir. Hemen her şey bir class içinde yaşar. Class, ilişkili veri ve davranışı bir arada tutan kalıptır. struct da benzer iş yapar ama bellek davranışı farklıdır (stack üzerinde yaşar, değer tipidir).
method bir class içinde tanımlanan, çağrıldığında çalışan bir davranış bloğudur. Tipik bir method dört bilgi taşır:
- Erişim belirleyici (public, private vb.) — kim çağırabilir
- Dönüş tipi (void, int, string vb.) — ne döndürür
- Ad — çağrılacak isim
- Parametreler — neyle çağrılır
Örnek: public int Topla(int a, int b). Bu satır tek başına yedi farklı bilgi taşır: bu method dışarıdan erişilebilir, geri sayı döndürür, adı Topla'dır, iki sayı parametresi alır. Method gövdesi süslü parantezler arasındadır — gerçek davranış orada yazılır.

Veri Tipi ve Değişken Kelimeleri
C# güçlü tipli bir dildir; her değişkenin bir tipi olmak zorundadır. En yaygın temel tipler:
- int — tam sayı (32-bit)
- long — büyük tam sayı (64-bit)
- double — ondalıklı sayı
- decimal — finansal hassasiyet gerektiren ondalıklı
- string — metin
- bool — true/false
- char — tek karakter
- DateTime — tarih ve saat
var ise özel bir kelimedir. Tip belirtmez — derleyici sağ taraftaki ifadeden tipi kendisi çıkarır. var sayi = 5; yazdığında derleyici otomatik int olduğunu anlar. var "tip yok" demek değildir; "tipi sen yazma, ben çıkarayım" demektir.
const derleme zamanında bilinen sabit bir değeri tutar. readonly ise yalnızca yapıcı (constructor) içinde atanır, sonra değişmez. Bu ikisi sık karıştırılır.
Generic koleksiyonlarda tip parametresi köşeli parantez yerine açılı parantez içine yazılır: List<int>, Dictionary<string, int>. Açılı parantez burada karşılaştırma operatörü değildir — tip parametresi sınırlayıcısıdır.
Akış Kontrol Kodları
Kodun her satırı sırayla çalışmaz; bazı kelimeler akışı yönlendirir. En yaygınları:
- if / else — koşula göre dallan
- switch — bir değere göre çoklu seçim yap
- for — sayaç tabanlı tekrar
- foreach — koleksiyon üzerinde tekrar
- while — koşul sağlandığı sürece tekrar
- do-while — en az bir kez çalışıp sonra koşula bak
- break — döngüden çık
- continue — bu turu atla, sonrakine geç
- return — method'tan değer döndür ve çık
Modern C# ile switch expression geldi:
var sonuc = gun switch { 1 => "Pazartesi", 2 => "Salı", _ => "Bilinmiyor" };
Bu yapı klasik switch'ten daha kompakt ve değer döndürür. Pattern matching ile birleştiğinde okunabilirliği bir basamak yukarı çıkarır.
Erişim Belirleyiciler
Bir class veya method tanımının önüne yazılan bu kelimeler, kodu kimin görebileceğini kontrol eder:
- public — her yerden erişilebilir
- private — yalnızca tanımlandığı class içinden erişilebilir (varsayılan)
- protected — tanımlandığı class ve ondan türeyen class'lardan erişilebilir
- internal — aynı assembly (proje) içinden erişilebilir
- protected internal — ikisinin birleşimi
- private protected — daha kısıtlı birleşim (C# 7.2+)
Yanlarına yardımcı kelimeler de eklenir: static (instance'a değil class'ın kendisine ait), abstract (gövdesiz, türeyen class doldurur), virtual (türeyen class override edebilir), sealed (artık türetilemez), partial (tanım birden fazla dosyaya bölünebilir).
Bu kelimeleri bilmek nesne yönelimli tasarımı doğru kurmanın anahtarıdır. Sağlam bir başlangıç için uygulamalı C# eğitim programı hem dil temellerini hem nesne yönelimli prensipleri pratikle birlikte ele alır.
Modern C# Sözcükleri
Son on yılda C#'a giren bazı kelimeler dili belirgin biçimde modernleştirdi. Bunlar artık günlük kodda standart:
async / await — Asenkron işlemler için. async bir method'un asenkron olduğunu işaretler, await ise asenkron bir işlemin sonucunu beklerken thread'i bloklamadan diğer işlere izin verir. Web API, dosya I/O, veritabanı çağrısı gibi bekleme süresi içeren her yerde kullanılır.
Lambda ifadesi — Küçük, isimsiz bir method. x => x * 2 bir parametre alıp iki katını döndürür. LINQ sorgularında sık görülür.
LINQ — Language Integrated Query. Veri kümeleri üzerinde SQL benzeri sorgular yazmanı sağlar: liste.Where(x => x.Yas > 18).OrderBy(x => x.Ad).ToList().
record — Değişmez (immutable) veri taşıma için optimize edilmiş tip. Eşitlik karşılaştırması referans değil değer bazlı yapılır.
nullable referans tipi — String? yazdığında "bu değişken null olabilir" diyorsun. Derleyici null-safety kontrolü yapar. ?. ve ?? operatörleri null durumlarda kestirme yol sağlar.
using statement — Dosya başındaki using ile aynı isimde ama farklı iş yapar. using (var f = File.OpenRead(...)) blok bitince f'in kaynaklarını otomatik serbest bırakır. Modern syntax ile using var f = File.OpenRead(...); şeklinde tek satıra düşer.
Operatörler ve Sembollerin Anlamı
C# kodunda kelimelerden daha fazla sembol görürsün. En sık karşılaşılanlar:

=— atama (değişkene değer ver)==— eşitlik karşılaştırması!=— eşit değil&&— mantıksal VE (her ikisi de doğruysa)||— mantıksal VEYA!— mantıksal DEĞİL++/--— bir artır / bir azalt+=— kendine ekle ve ata?:— üçlü koşul:x > 0 ? "pozitif" : "değil"??— null-coalescing: sol null ise sağı kullan?.— null-safe erişim: nesne null ise hata vermeden null döndür=>— lambda veya expression-bodied member$"..."— string interpolation:$"Merhaba {ad}"@"..."— verbatim string: kaçış karakteri tanımaz
Bu sembollerin her birinin bir adı ve bir görevi vardır. Ezberlemek yerine her birini gördüğünde "bu hangi kategoriden?" diye sormak yeterlidir: atama mı, karşılaştırma mı, null kontrol mü, lambda mı?
Kategori Düşünmek Neden İşe Yarar
Bir C# dosyasına baktığında her satırı şu sorularla okumaya başlarsan kod hızla şeffaflaşır: Bu satır bir kütüphane mi çağırıyor? Bir yapı mı tanımlıyor? Bir veri mi tutuyor? Bir akışı mı yönlendiriyor? Bir davranışı mı çalıştırıyor? Beş kategori vardır ve her satır en az birine girer. Daha sonra erişim belirleyiciler, modern syntax ve operatörler bu temelin üzerine eklenir.
C# kodu okumayı öğrenmek aslında kelime dağarcığı değil, kategori farkındalığı meselesidir. Bu farkındalığı bir kez kurduğunda yeni bir kütüphane, yeni bir framework veya yeni bir syntax ile karşılaştığında doğru kutuya yerleştirip yoluna devam edebilirsin.



