C# Struct Kullanımı

ismail kaşan
3 min readOct 30, 2024

--

C# Struct Kullanımı
C# Struct Kullanımı

C# dilinde, tipler value-type ve reference-type olarak ikiye ayrılır. C#’in kendi içinde primitive dediğimiz ilkel(int, short, long gibi) tipler mevcuttur. Fakat bazen ihtiyaca istinaden sadece değer tipleri taşıyan özel tiplere ihtiyaç duyulmaktadır. Bu özel değer tipleri Struct yapısı ile oluşturulur. Struct küçük, hafif veri yapılarını tanımlamak için kullanılır. Struct ile tanımlanan veriler bellekte Stack üzerinde depolanır ve genellikle performans avantajı sağlar, çünkü bellek yönetimi daha hızlıdır.

Struct’lar, sınıflara benzer şekilde, içlerinde aşağıdaki bütün elemanları barındırırlar.

  • Parameterized constructor
  • Static constructor
  • Constants
  • Fields
  • Methods
  • Properties
  • Indexers
  • Operators
  • Events

Ancak bazı önemli farkları vardır. Örneğin, Struct’lar kalıtım (inheritance) desteği sunmazlar ve varsayılan olarak bir referans türü (object) yerine bir değer (value-type) türüdür. Bu özellikleri nedeniyle Struct’lar, genellikle basit veri modelleri, matematiksel ve geometrik yapılar veya düşük bellek ayak izine sahip nesneler için tercih edilir.

Structure Tanımı

Bir Struct, struct kelimesi kullanılarak tanımlanır. Struct’ların default modifier’ı internaldır. Aşağıdaki örenkte bir Struct tanımı vardır.

struct Coordinate
{
public int x;
public int y;
}

Bir Struct objesi new keyword’ü ile yada new keyword’ü olmadan da oluşturulabilir. Aynı primitive type’ler gibi kullanılabilir.

Coordiate nokta=new Coordibate();

nokta.x=100;
nokta.y=150;

Console.Writeline(nokta.x) // Çıktı 100
Console.Writeline(nokta.y) // Çıktı 150

Yukarıdaki örnek te nokta objesi new keyword’dü ile oluşturulmuştur. Dolayısıyla default parameterless-constructor çağrılmıştır ve field’lar default değerleri ile oluşturulmuştur. Eğer bir Struct’ı new keyword’ü olmadan oluşturursanız contsructor çağrılmayacaktır ve bütün field ve elemanların değerleri atanmamış olacaktır. Öyleyse kullanmadan önce değerlerinin atanması gerekecektir. Aksi halde compiler hatası fırlatılacaktır.

Coordinate nokta;
Console.Writeline(nokta.x) // Compiler hatası. new keyword'ü ile nokta oluşturulmadığı için x'in değere henüz atanmamştır.

nokta.x=100;
Console.Writeline(nokta.x); // 100

Struct’ta Constructor’lar

Bir Struct’a parameterless-constructor tanımlanamaz. İçinde zaten default olarak kendisi gelir. Sadece parameterized-constructor veya static-constructor tanımlanabilir. Fakat parameterized-constructor kullanırken bütün elemanlara değer ataması yapılmalıdır. Aksi halde compiler hatası alınır.

struct Coordinate
{
public int x;
public int y;

public Coordinate(int x, int y)
{
this.x=x;
this.y=y;
}
}

Coordinate nokta=new Coordinate(10,20);
Console.Writeline(nokta.x); // 10
Console.Writeline(nokta.y); // 20

Struct’ta Metodlar ve Property’ler

Bir Struct’a aynı sınıftaki gibi property’ler, otomatik tanımlanmış property’ler ve metodlar tanımlanabilir.

struct Coordinate
{
public int x { get; set; }
public int y { get; set; }

public void SetOrigin()
{
this.x=0;
this.y=0;
}
}

Coordinate nokta=new Coordinate();
nokta.SetOrigin();

Console.Writeline(nokta.x); // 0 default değeri yazdırır.

Struct’ta Event’lar

Bir Struct kendisine abone olanları haberdar etmek için bir event tanımlanabilir. Aşağıdaki Struct yapısında bir tane Action<int> delegate tipinde event tanımı vardır. x’in değere set edildiğinde event tetiklenir.

struct Coordinate
{
private int _x;

public int x
{
get{
return _x;
}

set{
_x=value;
CoordinateChanged(_x);
}
}
public event Action<int> Coordinatechanged;
}

Tetiklenen bu event’i aşağıdaki gibi yakalanır ve gerekli işlem yapılır.

public void createPoint()
{
Coordinate nokta=new coordinate();
nokta.CoordinateChanged+=StructEventHandler;
nokta.x=100;
}

public void StructEventHandler(int yeniDeger)
{
Console.Writeline($"Değişen değer :{ yeniDeger}");
}

Özet:

Struct’lar value type’tır. Dolayısıyla sınıf objelerinden daha hızlıdırlar. Çünkü belleğin Stack bölgesinde tutulurlar ve erişimleri daha hızlıdr.

  1. Struct’larda constructors, fields, methods, properties, indexers, operators ve events gibi yapılar tanımlanabilir ve kullanlabilir.
  2. Struct’larda parameterless-constructor ve destructor kullanılamaz.
  3. Struct’lar aynı sınıflar gibi interface implementasyonu yapabilirler. Fakat başka bir Struct veya sınıfı miras alamazlar. Hatta başka sınıflara base olamazlar.
  4. Dolayısıyla Struct member’ları abstract, sealed, virtual veya protected olamazlar.

Sonuç olarak, C# dilinde Struct kullanımı, özellikle hafif ve performans açısından kritik uygulamalarda büyük avantajlar sunar. Struct, bellek yönetiminde sağladıkları verimlilik ve değere dayalı doğaları sayesinde, sıkça kullanılan veri yapılarını tanımlamak için idealdir. Ancak, Struct ve sınıf arasındaki farkları anlamak ve uygun duruma göre doğru veri türünü seçmek önemlidir. Struct’lar, kalıtım gerektirmeyen ve küçük veri kümeleriyle çalışılan senaryolar için mükemmel bir seçimdir. Doğru kullanıldığında, C# dilinde yazılan uygulamaların performansını ve verimliliğini önemli ölçüde artırabilirler.

Yazıyı, yeni başlayanlar veya İngilizcesi yeterli olmayanlar için mümkün olduğunca anlaşılır bir şekilde yazmaya çalıştım. Umarım faydalı olmuştur. Aklınıza takılan herhangi bir soruyu çekinmeden yorumlarda sorabilirsiniz.

Yaralanılan Kaynaklar:

--

--

ismail kaşan
ismail kaşan

Written by ismail kaşan

I am a full stack developer since 2016.

No responses yet