C# Struct (Yapılar) – Class ile Farkları
C#’ta struct ve class arasındaki farkları öğrenin. Bellek modeli, kalıtım, boxing ve performans karşılaştırmalarıyla açıklanıyor.
C# dilinde class (sınıf) ve struct (yapı), veri ve davranışları bir araya getiren iki temel türdür.
İlk bakışta birbirine benzeseler de bellek yönetimi ve kullanım amaçları bakımından önemli farkları vardır.
class türleri referans tip, struct türleri ise değer tip olarak davranır.
Struct Nedir?
struct, genellikle küçük, kısa ömürlü ve basit veri kümelerini temsil etmek için kullanılır.
Örneğin, 2B koordinat noktası veya tarih aralığı gibi durumlarda uygundur.
Varsayılan olarak değer tiptir, yani kopyalandığında yeni bir bağımsız kopya oluşturulur.
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{
X = x;
Y = y;
}
public void Print()
{
Console.WriteLine($"({X}, {Y})");
}
}
Struct ve Class Farkları
Aşağıda struct ve class arasındaki en temel farklar listelenmiştir:
- Tip Türü:
structbir değer tipidir,classise referans tipidir. - Bellek: Yapılar genellikle stack üzerinde saklanır; sınıflar heap üzerinde tutulur.
- Kopyalama: Bir yapı değişkene atandığında tüm değerler kopyalanır. Sınıflarda sadece referans kopyalanır.
- Varsayılan Yapıcı (constructor): Yapılar parametresiz yapıcıyı (C# 10 öncesinde) tanımlayamaz, sınıflar tanımlayabilir.
- Miras (Inheritance): Yapılar başka bir yapıdan veya sınıftan türetilemez. Ancak
interfaceuygulayabilirler. - Null değer: Yapılar varsayılan olarak null olamaz; nullable yapılara (
Point?) izin verilir. Sınıflar null olabilir.
Kopyalama Davranışı
Yapılar kopyalandığında tamamen yeni bir kopya oluşur. Sınıflarda ise sadece referans aktarılır ve iki değişken aynı nesneyi işaret eder.
Point p1 = new Point(10, 20);
Point p2 = p1; // kopyalandı
p2.X = 99;
Console.WriteLine(p1.X); // 10 (bağımsız kopya)
Console.WriteLine(p2.X); // 99
class Person
{
public string Name { get; set; }
}
var p1 = new Person { Name = "Ali" };
var p2 = p1; // aynı referans
p2.Name = "Veli";
Console.WriteLine(p1.Name); // "Veli"
Console.WriteLine(p2.Name); // "Veli"
Referans Tipler ve Değer Tipler
C#’ta türler temelde ikiye ayrılır: değer tipleri ve referans tipleri.
struct değer tipidir; değişkene atandığında veya metoda parametre olarak verildiğinde tüm veriler kopyalanır.
Yani bir kopyada yapılan değişiklik diğerini etkilemez.
class ise referans tipidir; değişkene atandığında bellekteki aynı nesneyi işaret eden bir referans kopyalanır.
Bu nedenle bir referans üzerinden yapılan değişiklik diğer referanslarda da görünür.
// Değer tipi (struct)
Point p1 = new Point(1, 2);
Point p2 = p1; // kopya
p2.X = 99;
Console.WriteLine(p1.X); // 1
Console.WriteLine(p2.X); // 99
// Referans tipi (class)
Person a = new Person { Name = "Ayşe" };
Person b = a; // aynı nesne
b.Name = "Fatma";
Console.WriteLine(a.Name); // Fatma
Console.WriteLine(b.Name); // Fatma
Ne Zaman Struct, Ne Zaman Class?
Küçük, değişmez (immutable) ve davranışları sınırlı veri tiplerinde struct kullanmak uygundur.
Büyük, karmaşık, yaşam döngüsü uzun ve miras gerektiren yapılarda ise class tercih edilmelidir.
Örneğin 3D noktaları, renk değerleri, tarih aralıkları için struct; müşteri, ürün, sipariş gibi kavramlar için class daha mantıklıdır.
Örnek: Struct ile Nokta Hesaplama
public struct Point2D
{
public int X { get; }
public int Y { get; }
public Point2D(int x, int y)
{
X = x;
Y = y;
}
public double DistanceTo(Point2D other)
{
int dx = X - other.X;
int dy = Y - other.Y;
return Math.Sqrt(dx * dx + dy * dy);
}
}
class Program
{
static void Main()
{
var p1 = new Point2D(0, 0);
var p2 = new Point2D(3, 4);
Console.WriteLine(p1.DistanceTo(p2)); // 5
}
}
TL;DR
struct= değer tipi,class= referans tipi.- Struct küçük ve basit veri kümeleri için uygundur; class karmaşık nesneler için.
- Struct kopyalanınca bağımsız bir kopya oluşur; class kopyalanınca aynı nesneye referans edilir.
- Struct miras alamaz ama interface uygulayabilir; class miras alabilir.
- Struct varsayılan olarak null olamaz; class null olabilir.