C#'ta value type ile reference type arasındaki fark nedir? Boxing ve unboxing ne demektir?
Cevap
- Value type (
int,double,bool,struct,enum): değişken verinin kendisini tutar. Atama ve parametre geçişinde değer kopyalanır. - Reference type (
class,string,array,delegate,record class): değişken heap'teki nesneye bir referans tutar. Atamada referans kopyalanır, iki değişken aynı nesneyi gösterir.
struct PointS { public int X; }
class PointC { public int X; }
var s1 = new PointS { X = 1 };
var s2 = s1; s2.X = 99; // s1.X hâlâ 1
var c1 = new PointC { X = 1 };
var c2 = c1; c2.X = 99; // c1.X artık 99"Value type stack'te, reference type heap'te yaşar" sözü basitleştirmedir: bir class'ın alanı olan int heap'te durur; lambda tarafından yakalanan lokal değişken de heap'e taşınır. Doğru ayrım kopyalama semantiğidir.
Boxing / unboxing
Value type'ın object veya bir interface olarak kullanılması için heap'te kutulanmasına boxing denir; geri çevrilmesi unboxing'dir.
int n = 42;
object o = n; // boxing: heap allocation
int m = (int)o; // unboxing: tip kontrolü + kopyaSık boxing (eski ArrayList, object parametreli API'ler) gereksiz GC baskısı yaratır; generic koleksiyonlar (List<int>) bunu önler.
Ne zaman struct?
Küçük (yaklaşık 16 byte altı), immutable, değer anlamı taşıyan tipler için (Money, Coordinate). Büyük struct'lar her geçişte kopyalandığı için yavaşlatır; readonly struct ve in parametresi kopyayı azaltır.
string bir reference type'tır ama immutable olduğu ve == değer karşılaştırması yaptığı için value type gibi davranır.
İlgili C# & .NET soruları
- .NET'te Garbage Collector nasıl çalışır? Generation'lar, Large Object Heap ve IDisposable ilişkisini açıklayın.
- EF Core'da change tracking nasıl çalışır? AsNoTracking ne zaman kullanılır ve N+1 problemi nasıl önlenir?
- IEnumerable<T> ile IQueryable<T> arasındaki fark nedir? EF Core'da yanlış kullanım ne gibi sorunlara yol açar?
- LINQ'te deferred execution nedir? Aşağıdaki kodun çıktısı ne olur?
- async/await kullanırken .Result veya .Wait() çağırmak neden deadlock'a yol açabilir? ConfigureAwait(false) ne işe yarar?
- ASP.NET Core DI'da Transient, Scoped ve Singleton lifetime'ları arasındaki fark nedir? Captive dependency nedir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.