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ü + kopya

Sı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.

  1. .NET'te Garbage Collector nasıl çalışır? Generation'lar, Large Object Heap ve IDisposable ilişkisini açıklayın.ZorC# & .NETBackend
  2. EF Core'da change tracking nasıl çalışır? AsNoTracking ne zaman kullanılır ve N+1 problemi nasıl önlenir?OrtaC# & .NETBackend
  3. IEnumerable<T> ile IQueryable<T> arasındaki fark nedir? EF Core'da yanlış kullanım ne gibi sorunlara yol açar?KolayC# & .NETBackend
  4. LINQ'te deferred execution nedir? Aşağıdaki kodun çıktısı ne olur?OrtaC# & .NETBackend
  5. async/await kullanırken .Result veya .Wait() çağırmak neden deadlock'a yol açabilir? ConfigureAwait(false) ne işe yarar?ZorC# & .NETBackend
  6. ASP.NET Core DI'da Transient, Scoped ve Singleton lifetime'ları arasındaki fark nedir? Captive dependency nedir?OrtaC# & .NETBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle