C#, Microsoft'un geliştirdiği, .NET platformunda çalışan, statik tipli ve nesne yönelimli bir programlama dilidir. Bir C# mülakatında sizden temel OOP kavramlarını, orta seviye dil yapılarını (interface, delegate, LINQ) ve ileri seviyede asenkron programlama ile bellek yönetimi konularını açıklamanız beklenir.
Hangi Seviyede Hangi Konular Sorulur?
C# mülakatları genellikle pozisyonun kıdemine göre üç seviyede ilerler. Aşağıdaki tablo, hangi seviyede hangi konuların öne çıktığını özetler.
| Seviye | Odak Konular | Örnek Soru Tipi |
|---|---|---|
| Temel (Junior) | OOP dört sütunu, value/reference type, temel sözdizimi | "Encapsulation nedir?" gibi tanım soruları |
| Orta (Mid) | Interface/abstract class, delegate/event, LINQ, koleksiyonlar | "Bu koleksiyonu LINQ ile nasıl filtrelersiniz?" gibi uygulama soruları |
| İleri (Senior) | async/await, garbage collection, performans, mimari kararlar | "Bu kodun performans sorunu nerede?" gibi analiz soruları |
Temel Seviye Sorular
Temel seviye sorular, adayın nesne yönelimli programlamanın dört sütununu ve C#'ın tip sistemini gerçekten anlayıp anlamadığını ölçer.
Nesne Yönelimli Programlama Kavramları
Mülakatlarda bu dört kavram tek tek ve birbirinden net bir şekilde ayrılarak sorulur:
- Encapsulation (kapsülleme): Bir sınıfın verilerini
privatetutup dışarıya sadecepropertyveya metotlar üzerinden erişim vermesidir. Amaç veri bütünlüğünü korumaktır. - Inheritance (kalıtım): Bir sınıfın
: BaseClasssöz dizimiyle başka bir sınıfın üye ve davranışlarını devralmasıdır. Kod tekrarını azaltır. - Polymorphism (çok biçimlilik): Aynı metodun farklı sınıflarda farklı davranması; C#'ta
virtual/overrideile derleme zamanı sonrası (runtime) polimorfizm, metot aşırı yükleme (overload) ile derleme zamanı polimorfizmi sağlanır. - Abstraction (soyutlama): Karmaşık bir davranışın
abstract classveyainterfacearkasına gizlenip sadece gerekli olanın dışarı açılmasıdır.
Value Type ve Reference Type Farkı
C#'ta struct, int, bool gibi value type'lar değerlerini doğrudan bellekte (genellikle stack'te) tutar ve bir değişkene atandığında kopyalanır. class ile oluşturulan reference type'lar ise heap'te tutulur ve değişkenler bu nesneye bir referans taşır; bir referansı başka bir değişkene atamak aynı nesneyi işaret eden iki değişken oluşturur. Bu fark, mülakatlarda genellikle bir kod parçasının çıktısını tahmin etme sorusu olarak karşınıza çıkar.
| Soru | Cevap |
|---|---|
| Interface nedir? | Bir sınıfın implemente etmesi gereken metot ve property imzalarını tanımlayan, gövde içermeyen bir sözleşmedir. C#'ta bir sınıf birden fazla interface implemente edebilir. |
| Namespace ne işe yarar? | Sınıfları mantıksal gruplara ayırarak aynı isimdeki tiplerin farklı namespace'lerde çakışmadan bir arada bulunmasını sağlar. |
| Boxing/unboxing nedir? | Bir value type'ın <code>object</code> tipine (heap'e) sarılmasına boxing, tekrar orijinal value type'a çevrilmesine unboxing denir; sık kullanımı performansı düşürür. |
| const ile readonly farkı nedir? | <code>const</code> derleme zamanında sabitlenir ve sadece ilkel tiplerde kullanılır; <code>readonly</code> çalışma zamanında (örneğin constructor içinde) bir kez atanabilir ve her tipte kullanılabilir. |
Exception Handling: try/catch/finally
C#'ta hata yönetimi try/catch/finally blokları ile yapılır: try içindeki kod çalışırken bir istisna (exception) oluşursa, uygun tipteki ilk catch bloğu devreye girer; finally ise istisna olsun ya da olmasın her durumda çalışır ve genelde kaynak temizleme (bağlantı kapatma gibi) için kullanılır. Mülakatlarda sık sorulan tuzak: çok genel bir catch (Exception ex) kullanmak yerine, beklenen hata tiplerini (catch (SqlException) gibi) spesifik olarak yakalamanın neden daha iyi bir pratik olduğunu açıklayabilmektir.
Orta Seviye Sorular
Orta seviye sorular dilin yapısal özelliklerini gerçek kod üzerinde kullanabilme becerisini test eder.
Interface ve Abstract Class Arasındaki Fark
Bir abstract class hem tanım hem de kısmi implementasyon (gövdesi olan metotlar) içerebilir ve bir sınıf yalnızca bir abstract class'tan türeyebilir. Bir interface ise (varsayılan metot desteği hariç) sadece sözleşme tanımlar ve bir sınıf birden fazla interface'i aynı anda implemente edebilir. Mülakatlarda bu farkın "ne zaman hangisini seçersiniz" sorusuyla birlikte gelmesi yaygındır: ortak davranış ve durum paylaşımı gerekiyorsa abstract class, sadece bir yetenek sözleşmesi gerekiyorsa interface tercih edilir.
Delegate, Event ve Lambda İfadeleri
Delegate, bir veya birden fazla metodun referansını tutabilen bir tür güvenli fonksiyon işaretçisidir. Event, bir delegate'in üzerine inşa edilmiş, sadece tanımlandığı sınıf içinden tetiklenebilen, dışarıdan sadece abone olunabilen özel bir yapıdır.
public delegate void SiparisTamamlandi(string siparisNo);
public class Siparis
{
public event SiparisTamamlandi OnTamamlandi;
public void Tamamla(string siparisNo)
{
// İş mantığı burada çalışır
OnTamamlandi?.Invoke(siparisNo);
}
}
// Kullanım
var siparis = new Siparis();
siparis.OnTamamlandi += (no) => Console.WriteLine($"Sipariş {no} tamamlandı");LINQ ve Koleksiyonlar
LINQ (Language Integrated Query), koleksiyonlar üzerinde SQL benzeri bir sözdizimiyle sorgulama yapmayı sağlar. Mülakatlarda genellikle Where, Select, OrderBy, GroupBy ve FirstOrDefault gibi metotların ne zaman kullanılacağı ve deferred execution (sorgunun tanımlandığı anda değil, gerçekten iterasyona uğradığı anda çalışması) kavramı sorulur.
var aktifKullanicilar = kullanicilar
.Where(k => k.IsActive)
.OrderBy(k => k.Ad)
.Select(k => new { k.Id, k.Ad })
.ToList();Nullable Types ve Null-Conditional Operatör
Value type'lar varsayılan olarak null olamaz; int? (yani Nullable<int>) yazarak bir value type'ın null da alabilmesini sağlarsınız. ?. (null-conditional) operatörü, bir nesne null ise zincirdeki geri kalan erişimi atlayıp doğrudan null döndürür; ?? (null-coalescing) ise null durumunda kullanılacak varsayılan değeri belirtir. C# 8 ile gelen nullable reference types özelliği (string? gibi), derleyicinin olası null referans hatalarını derleme zamanında uyarı olarak göstermesini sağlar.
public string SehirAdiGetir(Kullanici? kullanici)
{
return kullanici?.Adres?.Sehir ?? "Bilinmiyor";
}İleri Seviye Sorular
Senior pozisyonlarda dilin performans ve mimari boyutuyla ilgili sorular öne çıkar.
Asenkron Programlama: async/await
async/await, uzun süren işlemleri (ağ çağrısı, dosya okuma) ana iş parçacığını bloklamadan çalıştırmayı sağlar. Mülakatlarda sık sorulan bir tuzak, async void ile async Task arasındaki farktır: async void hataları yakalanamaz hâle getirdiği için sadece event handler'larda kullanılmalı, geri kalan her yerde async Task tercih edilmelidir.
public async Task<string> VeriGetirAsync(string url)
{
using var client = new HttpClient();
var yanit = await client.GetAsync(url);
yanit.EnsureSuccessStatusCode();
return await yanit.Content.ReadAsStringAsync();
}Garbage Collection ve Bellek Yönetimi
.NET'in çöp toplayıcısı (Garbage Collector), artık erişilemeyen nesneleri otomatik olarak bellekten temizler ve nesilli (generational) bir modelle çalışır: kısa ömürlü nesneler 0. nesilde, uzun ömürlü nesneler 2. nesle kadar terfi eder. Mülakatlarda IDisposable arayüzünün ve using bloğunun neden gerekli olduğu (dosya, veritabanı bağlantısı gibi yönetilmeyen kaynakları GC beklemeden serbest bırakmak için) sıkça sorulur.
Performans Optimizasyonu
Sık karşılaşılan performans sorularından biri string birleştirmedir: döngü içinde + ile string birleştirmek her seferinde yeni bir string nesnesi oluşturduğu için StringBuilder kullanmak gerekir. Bir diğer klasik konu, gereksiz boxing/unboxing'den kaçınmak ve büyük koleksiyonlarda List<T> yerine ihtiyaca göre Dictionary<TKey, TValue> gibi arama maliyeti daha düşük yapılar seçmektir.
AppFellas
Fikrinizi konuşalım.
Ücretsiz keşif görüşmesinde projenizi, bütçenizi ve zaman çizelgenizi netleştirelim.
Sık Yapılan C# Hataları
- Genel
catch (Exception)kullanmak: Tüm hataları tek bir blokta yakalamak, hangi hatanın gerçekte ne anlama geldiğini gizler ve hata ayıklamayı zorlaştırır. - IDisposable nesneleri
usingolmadan bırakmak: Veritabanı bağlantısı, dosya akışı gibi yönetilmeyen kaynaklar açık kalırsa, bellek ve bağlantı sızıntısına yol açar. - Döngüde string birleştirmek:
foriçinde+ile string birleştirmek her seferinde yeni bir nesne oluşturur;StringBuilderkullanmak gerekir. - async metotları
.Resultile senkron beklemek: Bu, özellikle UI thread'inde deadlock'a yol açabilecek bilinen bir anti-pattern'dir; doğrusu zinciri sonuna kadarawaitile taşımaktır.
Örnek Mülakat Senaryosu: Kod İnceleme
Mülakatlarda sık karşılaşılan bir format, hazır bir kod parçası verip içindeki sorunu bulmanızı istemektir. Örneğin aşağıdaki metot, bir liste boşken çalışma zamanı hatası fırlatır:
// Hatali:
public Kullanici IlkAktifKullanici(List<Kullanici> liste)
{
return liste.First(k => k.IsActive); // eslesme yoksa InvalidOperationException firlatir
}
// Duzeltilmis:
public Kullanici? IlkAktifKullanici(List<Kullanici> liste)
{
return liste.FirstOrDefault(k => k.IsActive);
}Beklenen cevap, sadece First yerine FirstOrDefault yazmak değil; metodun dönüş tipini Kullanici? yaparak "bulunamayabilir" durumunu tip sisteminde açıkça göstermektir. Mülakatı yapan kişi genelde bu ayrımı — hatayı susturmak ile durumu doğru modellemek arasındaki farkı — arar.
record ve Pattern Matching (C# 9+)
C# 9 ile gelen record tipi, değer eşitliğine (iki nesnenin tüm alanları aynıysa eşit sayılması) ve değişmezliğe (immutability) uygun veri taşıyıcıları tanımlamak için kullanılır; bir DTO (veri transfer nesnesi) için genelde class'tan daha az kod ile daha güvenli bir seçenektir. Pattern matching ise switch ifadelerinin bir tipin şekline veya değerine göre dallanmasını sağlar; mülakatlarda genellikle eski stil bir dizi if/else if zincirinin pattern matching ile nasıl sadeleştirileceği sorulur.
public record Urun(string Ad, decimal Fiyat);
string FiyatKategorisi(Urun urun) => urun switch
{
{ Fiyat: < 100 } => "Ekonomik",
{ Fiyat: >= 100 and < 500 } => "Orta",
_ => "Premium"
};Mülakata Hazırlık İçin Pratik İpuçları
- Kendi geliştirdiğiniz bir projeyi (ideal olarak GitHub'da) hazır bulundurun; mülakatçılar genellikle kod okuyup mimari kararlarınızı sorar.
- Basit bir algoritma sorusunu (dizi/liste üzerinde arama, sıralama) whiteboard'da veya paylaşımlı bir editörde yazarak pratik yapın; sözlü anlatmak ile canlı yazmak farklı beceriler gerektirir.
- Kullandığınız .NET sürümünü ve o sürüme özgü dil özelliklerini (örneğin
recordtipleri, pattern matching) bilin; "neden bu özelliği kullandınız" sorusuna hazır olun. - Bir kod parçasındaki hatayı veya performans sorununu sesli düşünerek bulma pratiği yapın; mülakatçılar çoğu zaman doğru cevaptan çok düşünme sürecinizi değerlendirir.
C# dışında farklı bir dil için de mülakata hazırlanıyorsanız Golang mülakat soruları, TypeScript mülakat soruları ve Java mülakat soruları yazılarımıza da göz atabilirsiniz. AppFellas'ın hayata geçirdiği projelere işlerimiz sayfasından ulaşabilir, ekip kurma veya yazılım geliştirme ihtiyaçlarınız için bizimle iletişime geçebilirsiniz.
Sıkça Sorulan Sorular
Sık sorulan sorular
C# mülakatı için kaç yıllık deneyim aranır?
Aranan deneyim ilana göre değişir. Junior pozisyonlarda temel OOP ve sözdizimi bilgisi yeterli olurken, mid ve senior pozisyonlarda gerçek proje deneyimi, performans kararları ve mimari tercihler hakkında konuşabilmeniz beklenir.
Mülakatta canlı kod yazmam istenir mi?
Çoğu C# mülakatında en az bir canlı kodlama bölümü bulunur. Bu genellikle whiteboard'da, paylaşımlı bir editörde veya online bir derleyici üzerinden basit bir algoritma ya da küçük bir OOP tasarımı yazmanız istenerek yapılır.
.NET Framework mi .NET (Core) mu bilmem gerekir?
Güncel şirketlerin çoğu artık cross-platform .NET (eski adıyla .NET Core) ile çalışır, ama eski .NET Framework projeleri de hâlâ yaygın. İkisi arasındaki temel farkları (platform desteği, proje dosyası yapısı, performans) bilmek faydalıdır.
Algoritma ve veri yapıları bilgisi ne kadar önemli?
Şirketten şirkete değişir. Bazı ekipler sadece C#'a özgü sorular sorar, bazıları buna ek olarak temel algoritma (sıralama, arama, karmaşıklık analizi) soruları da ekler. İlan metninde veya süreç öncesinde bunu netleştirmek en sağlıklı yoldur.
ASP.NET veya Entity Framework bilmek zorunlu mu?
Pozisyon web/backend odaklıysa genellikle evet. Masaüstü veya oyun geliştirme pozisyonlarında bunun yerine WPF, WinForms veya Unity gibi farklı bir bilgi seti istenebilir; bu detay ilanda belirtilir.



