.NET Geliştirici İş Görüşmesi Soruları ve Cevapları

.NET ekosisteminde kariyer hedefleyen geliştiriciler için hazırlanan bu kaynak, mülakat süreçlerinde karşılaşabileceğiniz teknik sorulara ve güncel metodolojilere odaklanmaktadır. Amacımız, en son teknolojiler, kütüphaneler ve sıkça sorulan mülakat konuları hakkında sizi bilgilendirerek başarı şansınızı artırmaktır.

Bu rehber, C#, ASP.NET, veritabanı yönetimi, yazılım prensipleri ve front-end teknolojileri gibi temel alanlardaki bilgilerinizi tazelemek ve derinleştirmek için tasarlanmıştır.

C# Temelleri ve İleri Konular

Null Birleştirme Operatörü (??) Nedir?

Null birleştirme operatörü (??), bir değişkenin null olup olmadığını kontrol etmek ve null ise varsayılan bir değer atamak için kısa ve okunaklı bir yol sunar. Geleneksel if kontrolü yerine tek satırda bu işlemi gerçekleştirmemizi sağlar.


var kullaniciAdi = mevcutKullaniciAdi ?? "Misafir";
// Eğer mevcutKullaniciAdi null ise, kullaniciAdi "Misafir" olarak atanır.
// Değilse, mevcutKullaniciAdi değeri atanır.
                    

C# Dilinde struct ve class Arasındaki Ayırt Edici Özellikler Nelerdir?

En temel fark, class'ların referans türü (reference type), struct'ların ise değer türü (value type) olmasıdır. Bu, bellek yönetimi ve kullanım şekillerini etkiler. class'lar kalıtımı desteklerken, struct'lar desteklemez (ancak interface implemente edebilirler). struct'lar genellikle daha küçük veri yapıları için ve performansın kritik olduğu durumlarda tercih edilirken, class'lar daha karmaşık nesneler ve OOP prensiplerinin tam olarak uygulandığı senaryolar için kullanılır.

abstract class ile interface Farklılıkları Nelerdir?

  • Kalıtım: Bir sınıf sadece bir abstract class'tan kalıtım alabilirken, birden fazla interface implemente edebilir.
  • Üye Tanımları: interface'ler sadece metot imzaları, property'ler, event'ler ve indexer'lar içerirken, abstract class'lar bunlara ek olarak somut (gövdeli) metotlar ve alanlar (fields) içerebilir.
  • Erişim Belirleyiciler: interface üyeleri varsayılan olarak public'tir ve erişim belirleyici almazlar. abstract class üyeleri farklı erişim belirleyicilere (public, protected, private vb.) sahip olabilir.
  • Amaç: interface'ler bir "sözleşme" tanımlarken (ne yapılacağını), abstract class'lar genellikle bir temel sınıf ("is-a" ilişkisi) oluşturmak ve ortak davranışları kısmen implemente etmek için kullanılır (nasıl yapılacağının bir kısmı).

virtual, abstract, sealed ve static Anahtar Kelimelerini Açıklayınız.

  • virtual: Türetilmiş sınıfların override edebileceği (ezebileceği) metot veya property'leri işaretler.
  • abstract: Sadece abstract sınıflar içinde kullanılabilir. İmplemente edilmemiş (gövdesiz) metot veya property'leri tanımlar. Türetilmiş sınıf bu üyeleri implemente etmek zorundadır. Abstract sınıflardan nesne türetilemez.
  • sealed: Bir sınıfın başka sınıflar tarafından kalıtım alınmasını veya bir metot/property'nin override edilmesini engeller.
  • static: Bir sınıfın örneğini (instance) oluşturmadan doğrudan sınıf üzerinden erişilebilen üyeleri (metot, property, field) tanımlar. Static sınıflardan nesne türetilemez ve sadece static üyeler içerebilir.

ASP.NET ve Web Teknolojileri

ASP.NET Web Forms ve ASP.NET MVC Arasındaki Temel Farklar Nelerdir?

Web Forms, olay güdümlü (event-driven) bir model sunar ve masaüstü uygulama geliştirmeye benzer bir deneyim sağlar (ViewState, Server Controls). MVC (Model-View-Controller) ise sorumlulukların ayrılması (Separation of Concerns) ilkesine dayalı bir mimari desendir. MVC, HTML üzerinde daha fazla kontrol, daha iyi test edilebilirlik ve modern web standartlarına (REST, URL Routing) daha yakın bir yapı sunar. Web Forms daha hızlı başlangıç sağlayabilirken, MVC genellikle daha büyük, sürdürülebilir ve test edilebilir uygulamalar için tercih edilir.

.NET Core Bağımlılık Enjeksiyonunda (DI) Nesne Yaşam Süreleri (Scoped, Transient, Singleton) Nelerdir?

  • Transient: Servis her talep edildiğinde yeni bir örnek (instance) oluşturulur. Hafif, durumsuz (stateless) servisler için uygundur.
  • Scoped: Her bir web isteği (request) başına tek bir örnek oluşturulur. İstek süresince aynı örnek kullanılır, farklı isteklerde yeni örnekler oluşturulur. Veritabanı context'leri gibi istek bazında durum tutması gereken servisler için idealdir.
  • Singleton: Uygulama ömrü boyunca sadece tek bir örnek oluşturulur ve her talepte aynı örnek kullanılır. Ayar (configuration) nesneleri, loglama servisleri gibi uygulama genelinde paylaşılması gereken durumlar için kullanılır. Dikkatli kullanılmalıdır, özellikle stateful (durum tutan) ise thread-safety sorunlarına yol açabilir.

.NET Core'da Tag Helper Kavramı Nedir?

Tag Helper'lar, Razor view'ları içerisinde sunucu taraflı kodları HTML benzeri bir sözdizimi ile yazmayı sağlayan bileşenlerdir. HTML elemanlarına özel attribute'lar ekleyerek veya tamamen yeni özel elemanlar oluşturarak çalışırlar. Geleneksel HTML Helper'lara göre daha doğal ve okunabilir bir HTML çıktısı üretmeyi hedeflerler. Örneğin, etiketi için asp-controller ve asp-action gibi attribute'lar kullanarak URL oluşturmayı kolaylaştırırlar.

Yazılım Geliştirme Genel Prensipleri

SOLID Prensipleri Nelerdir ve Kısaca Açıklayınız.

  • S (Single Responsibility Principle - Tek Sorumluluk Prensibi): Her sınıfın veya modülün sadece tek bir sorumluluğu olmalı, yani değişmek için tek bir nedeni olmalıdır.
  • O (Open/Closed Principle - Açık/Kapalı Prensibi): Yazılım bileşenleri (sınıflar, modüller) genişletilmeye açık, ancak değiştirilmeye kapalı olmalıdır. Yeni özellikler eklenirken mevcut kodun değiştirilmesi gerekmemelidir.
  • L (Liskov Substitution Principle - Liskov'un Yerine Geçme Prensibi): Alt sınıflar (türetilmiş sınıflar), üst sınıflarının (temel sınıfların) yerine geçebilmeli ve programın doğruluğunu bozmamalıdır.
  • I (Interface Segregation Principle - Arayüz Ayırma Prensibi): Sınıflar, kullanmadıkları metotları içeren "şişkin" arayüzleri implemente etmeye zorlanmamalıdır. Bunun yerine daha küçük, amaca özel arayüzler tanımlanmalıdır.
  • D (Dependency Inversion Principle - Bağımlılıkların Tersine Çevrilmesi Prensibi): Üst seviye modüller, alt seviye modüllere doğrudan bağımlı olmamalıdır. Her ikisi de soyutlamalara (arayüzler veya abstract sınıflar) bağımlı olmalıdır. Detaylar, soyutlamalara bağlı olmalıdır.

Kütüphane (Library) ve Çatı (Framework) Arasındaki Fark Nedir?

Temel fark kontrolün kimde olduğudur (Inversion of Control - IoC). Bir kütüphane kullandığınızda, kodunuz kütüphanenin fonksiyonlarını çağırır; yani kontrol sizdedir. Bir çatı kullandığınızda ise, çatı sizin kodunuzu çağırır; yani kontrol çatıdadır. Çatı, uygulamanın genel akışını ve yapısını belirlerken, kütüphane belirli işlevleri yerine getiren yardımcı araçlar sunar. Örneğin, jQuery bir kütüphanedir, ASP.NET Core ise bir çatıdır.

Deep Copy ve Shallow Copy Arasındaki Fark Nedir?

Bir nesneyi kopyalarken ortaya çıkan iki yöntemdir:

  • Shallow Copy (Sığ Kopyalama): Nesnenin sadece en üst seviyedeki alanlarını kopyalar. Eğer alanlar değer türüyse (int, bool vb.), değerleri kopyalanır. Eğer alanlar referans türüyse (başka nesneler, diziler), sadece referanslar (adresler) kopyalanır. Yani, orijinal ve kopya nesne, aynı iç nesnelere işaret eder. Birinde yapılan değişiklik diğerini etkileyebilir.
  • Deep Copy (Derin Kopyalama): Nesnenin tüm alanlarını ve bu alanların işaret ettiği nesneleri de (ve onların içindekileri de) özyinelemeli (recursive) olarak kopyalar. Orijinal ve kopya tamamen bağımsız hale gelir. Birinde yapılan değişiklik diğerini etkilemez.

Veritabanı Konuları (SQL ve Kavramlar)

SQL JOIN Türleri (INNER, LEFT, RIGHT, FULL OUTER) Arasındaki Farklar Nelerdir?

  • INNER JOIN: Her iki tabloda da eşleşen kayıtları getirir. Eşleşme olmayan kayıtlar sonuç kümesine dahil edilmez.
  • LEFT JOIN (veya LEFT OUTER JOIN): Sol tablodaki tüm kayıtları ve sağ tablodaki eşleşen kayıtları getirir. Sağ tabloda eşleşme yoksa, sağ tabloya ait sütunlar için NULL değerini getirir.
  • RIGHT JOIN (veya RIGHT OUTER JOIN): Sağ tablodaki tüm kayıtları ve sol tablodaki eşleşen kayıtları getirir. Sol tabloda eşleşme yoksa, sol tabloya ait sütunlar için NULL değerini getirir.
  • FULL OUTER JOIN: Her iki tablodaki tüm kayıtları getirir. Eşleşme olmayan kayıtlar için ilgili tablonun sütunlarına NULL değeri atanır.

SQL'de Index Nedir ve Neden Kullanılır?

Index (Dizin), veritabanı tablolarındaki verilere erişimi hızlandırmak için kullanılan özel bir veri yapısıdır. Bir kitaptaki dizin gibi çalışır; belirli bir veriyi bulmak için tüm tabloyu taramak yerine, index üzerinden daha hızlı bir şekilde ilgili satırın konumuna ulaşmayı sağlar. Özellikle WHERE ve JOIN koşullarında kullanılan sütunlara index eklemek, sorgu performansını önemli ölçüde artırabilir. Ancak, index'ler diskte ek yer kaplar ve INSERT, UPDATE, DELETE işlemlerini yavaşlatabilirler çünkü her veri değişikliğinde index'in de güncellenmesi gerekir.

Clustered Index ve Non-Clustered Index Farkları Nelerdir?

  • Clustered Index (Kümelenmiş Dizin): Tablodaki verilerin fiziksel olarak diskte nasıl sıralanacağını belirler. Bir tabloda sadece bir tane clustered index olabilir (genellikle Primary Key üzerinde otomatik oluşur). Veriler, index'in anahtarına göre sıralı tutulduğu için aralık sorgularında (range queries) çok etkilidir.
  • Non-Clustered Index (Kümelenmemiş Dizin): Verilerin fiziksel sırasını değiştirmez. Index, anahtar değerlerini ve bu değerlere karşılık gelen satırların konumlarını (row locator) içeren ayrı bir yapıdır. Bir tabloda birden fazla non-clustered index olabilir. Belirli bir kaydı bulmak için etkilidir, ancak verilerin kendisi index'te olmadığı için ek bir okuma adımı (lookup) gerektirebilir.

Front End Teknolojileri ve Kavramlar

Single-Page Application (SPA) Nedir?

SPA, kullanıcının etkileşimiyle tüm sayfanın yeniden yüklenmesi yerine, sadece değişen içerik bölümlerinin dinamik olarak güncellendiği modern bir web uygulaması mimarisidir. İlk yüklemede gerekli HTML, CSS ve JavaScript kodları tarayıcıya indirilir. Sonraki gezinmelerde genellikle sadece veriler (JSON formatında) sunucudan alınır ve sayfa yapısı JavaScript ile istemci tarafında (client-side) oluşturulur. Bu, daha akıcı ve masaüstü uygulamasına benzer bir kullanıcı deneyimi sağlar. Angular, React, Vue.js popüler SPA çatılarındandır.

Authentication ve Authorization Arasındaki Fark Nedir?

  • Authentication (Kimlik Doğrulama): Bir kullanıcının kim olduğunu doğrulama işlemidir. Genellikle kullanıcı adı/şifre, token, biyometrik veri gibi yöntemlerle yapılır. Sisteme "kimsin?" sorusunun cevabıdır.
  • Authorization (Yetkilendirme): Kimliği doğrulanmış bir kullanıcının hangi kaynaklara erişebileceğini veya hangi işlemleri yapabileceğini belirleme işlemidir. Sisteme "ne yapabilirsin?" sorusunun cevabıdır. Roller (admin, user) veya izinler (okuma, yazma) üzerinden yönetilir.

Önce Authentication yapılır, sonra Authorization kontrol edilir.

REST ve SOAP Servisleri Arasındaki Temel Farklılıklar Nelerdir?

  • Protokol: SOAP genellikle sadece HTTP/HTTPS üzerinden çalışır (ancak diğer protokolleri de destekleyebilir), REST ise çoğunlukla HTTP/HTTPS kullanır ancak protokolden bağımsız bir mimari stildir.
  • Veri Formatı: SOAP genellikle sadece XML formatını kullanır ve katı bir mesajlaşma yapısına (Envelope, Header, Body) sahiptir. REST ise daha esnektir; JSON, XML, YAML, hatta düz metin gibi farklı formatları destekleyebilir. JSON en yaygın kullanılanıdır.
  • Mimari Yaklaşım: SOAP bir protokoldür, REST ise bir mimari stildir. REST, HTTP metotlarını (GET, POST, PUT, DELETE vb.) kaynaklar üzerinde işlem yapmak için kullanır ve durumsuz (stateless) olmayı hedefler.
  • Performans ve Esneklik: REST genellikle daha hafif, daha hızlı ve daha esnek kabul edilir. SOAP ise daha standartlaşmış, güvenlik (WS-Security) ve işlem (transaction) yönetimi gibi konularda daha yerleşik özellikler sunabilir.