C#'ta struct ile class arasındaki fark nedir? Value type ve reference type oyunda neden önemlidir?
Cevap
| Özellik | struct (value type) | class (reference type) |
|---|---|---|
| Saklandığı yer | Değişken nerede ise orada (stack, dizi içinde, başka nesne içinde) | Heap üzerinde, değişken sadece referans tutar |
| Atama | Değerin tamamı kopyalanır | Sadece referans kopyalanır |
| GC | Kendi başına GC yükü oluşturmaz | GC tarafından toplanır |
| Kalıtım | Yok (interface uygulayabilir) | Var |
| null | Olamaz (Nullable<T> hariç) | Olabilir |
Unity'de Vector3, Quaternion, Color struct'tır. Bu yüzden şu kod çalışmaz:
transform.position.x = 5f; // derleme hatası: kopyanın alanı değiştirilemez
Vector3 p = transform.position; // kopya al
p.x = 5f;
transform.position = p; // geri ataOyunda neden önemli
- Her kare oluşturulan küçük veriler (vektör, hasar bilgisi) struct olursa heap allocation ve GC spike oluşmaz.
- Struct dizileri bellekte ardışık durur, cache dostudur; DOTS/ECS bu yüzden struct tabanlıdır.
Dikkat
- Büyük struct'lar (16-32 byte üstü) her geçişte kopyalandığı için yavaşlayabilir;
in/refparametreleriyle geçilebilir. - Struct'ı
objectveya interface olarak kullanmak boxing yaratır ve heap allocation'a yol açar. - Değiştirilebilir (mutable) struct'lar kopya semantiği yüzünden sinsi hatalara yol açar; mümkünse
readonly structkullanın.
İlgili Unity & C# soruları
- Unity'de Update, FixedUpdate ve LateUpdate arasındaki fark nedir?
- GetComponent çağrılarını neden önbelleğe almalısınız?
- Rigidbody, physics layer'lar ve raycast nasıl çalışır? FixedUpdate neden önemlidir?
- C# delegate, event ve UnityEvent arasındaki farklar nelerdir?
- Unity'de garbage collection neden frame düşüşüne yol açar? Update içinde allocation'dan nasıl kaçınırsınız?
- Prefab nedir? Prefab variant ve nested prefab ne işe yarar?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.