C# Structs (Yapılar)

Merhaba arkadaşlar,

Bir önceki yazımda sınıflarımızı bir dizi gibi kullanbaileceğimiz özellik olan Indexer (Indeksleyici) den bahsettik. Indexer (Indeksleyici) yazıma buradan ulaşabilirsiniz.

Bu yazımda C# programlama dilinde kullanılan Yapıları (Struct) ele alacağız. Yapılar C# dilinde değer tipli olan verilerdir. Yapı bildirimi sınıf bildirimi ile neredeyse aynıdır. class anahtar sözcüğü yerine struct anahtar sözcüğü kullanılır.

Neden struct kullanmalıyız?

Nesnelere bazen referans yolu ile erişmek avantajlı olmayabilir. Örneğin birbiri ile ilişkili az sayıda değişkeni bir sınıf içinde tutmak bellek kullanımı açısından pek yararlı değil. Artık biliyoruz ki referans tipler için heap bellek bölgesinden alan tahsis edilir ve stack bölgesinde bu alanın referans değeri tutulur. O yüzden heap bölgesindeki nesneye ulaşmak istediğimizde ayrıca zaman geçeceği için az sayıda eleman içeren ve sadece veri tipi olabilecek değişkenleri sınıf olarak tanımlamak tanımlamak yerine struct olarak tanımlamak hız ve verimlilik için daha faydalıdır. Yapılar değer tipli olduğu için yapı türünden nesneler stack bölgesinde saklanır. (Stack ve Heap yazıma buradan ulaşabilirsiniz.)

Not: Stack Heap bölgesine göre daha hızlıdır ve veriler art arda saklanır.

Yapı (Struct) bildirimi

Yapılar genellikle birbirleri ile ilişkili değişkenleri bir arada tutmak için kullanır ve nesne yönelimli programlamanın bel kemiği olan kalıtımı desteklemez. Yani yalıtımları türetemeyiz. Ancak C#’ta her şey bir nesnedir mantığından dolayı yapılar da object türünden türemiştir.

Student adında bir struct oluşturup değişkenlerini belirleyelim

Yapılarda aynen sınıflarda olduğu gibi new anahtar sözcüğü ile tanımlanabilirler. Bu şekilde tanımlanan yapı nesneleri için varsayılan yapıcı metotlar veya bizim tanımladığımız yapıcı metotlar çağrılabilir. Ayrıca new anahtar sözcüğü olmadan da yapı nesnelerini tanımlayabiliriz. Bu şekilde tanımlanan yapı nesnelerindeki değişkenlere ilk değer ataması yapılmaz

Bu şekilde tanımlanan yapı nesnesini derleyip çalıştırdığımızda ekrana 0 değerini yazdığını göreceksiniz. Çünkü new anahtar sözcüğü ile tanımladığımız için değişkenlere varsayılan değerler atandı. ( int türünün varsayılan değeri sıfırdır)

Bu şekilde derleyip çağırdığımızda ekranda “Use of possibly unassigned field ‘Age’” hatasını alırız yani değeri atanmamış “Age” hatası alırız. Hatırlarsanız bu durum değer tipindeki verileri kullanırken de aynı durumla karşılaşıyorduk. Buradan da değer tiplerde aslında birer yapı olduğunu çıkarabiliriz.

Yukarıdaki programı derlediğimizde ekrana 0 yazdığını görürsünüz. Buradan değer tipler birbirlerine aktarılırken bitsel olarak kopyalanır. Bu yüzden student yapı nesnesi ile stundent1 yapı nesnesi stack bölgesinde iki farklı yerde saklanır. Yani bu iki nesne birbirinden habersizdir.Birini değiştirmek diğerini değiştirmeyecektir. Ancak referans tipli değişkenler için bu durum aynı değildir.

Yukarıdaki programı derleyip çalıştırdığımızda ekrana 2 kere 19 değerini yazdırdığını göreceksiniz. Bunun sebebi değer tipli verilerin birbirine aktarılırken bitsel olarak kopyalandığından kaynaklı olmasıdır.

Yapılar da sınıflar gibi birden fazla yapıcı metotları olabilir. Ancak varsayılan yapıcı metodu bildiremeyiz. Aşağıdaki varsayılan yapıcı metot derleme zamanında hata verecektir. Bunun sebebi yapıcıların parametre alma zorunluluğudur.

Yani yapıcı metot bildiriminde bütün elemanların ilk değeri verme zorunluğu vardır. Buna göre aşağıdaki tanımlama geçerlidir.

Bu bilgiye istinaden yapıcı metot tanımlaması yaparken eleman sayısı kadar yapıcı metoda parametre eklenmeli diye düşülmesin. Aşağıdaki bildirimde geçerlidir.

Yapı nesneleri faaliyet alanları bittiğinde otomatik olarak stack bölgesinden silinirler. Programcının ayrıca bilinçli bir şekilde stack bölgesinden silmesine gerek yoktur. Bu yüzden yapılarda sınıflarda olduğu gibi yıkıcı metot bildirimi yapılamaz!

Sınıflarda olduğu gibi yapılarda da get ve set (otomatik özellik) ve indeksleyici (indexer) özellikleri yapılabilir.

Yapıların avantajları

  • Stack bellek bölgesinde bir değişken için alan ayırmak işi heap bölgesinde yapmaktan daha hızlıdır.
  • Sınıf nesneleri Garbage Collection mekanizması ile heap bölgesinden silinmektedir ve bunun ne zaman olacağı belli değildir. Yani bir nesnenin faaliyet alanı bittikten sonra yıkıcı metot çağrılmayabilir. Ancak yapı nesnelerinde bu durum farklıdır. Yapılarda yıkıcı metot olmamasına rağmen yapı nesneleri faaliyet alanı dışına çıktığında bellekten otomatik olarak silinir.
  • Stack bölgesinde bulunan değişkenlerin kopyalanması daha hızlıdır.

C# programlama dilinde yapılar neyi ifade ediyor, yapıları nerede kullanmalıyız öğrenmiş olduk.

Bu yazımda C# Structs (Yapılar) hakkında edindiğim bilgileri paylaşmaya çalıştım. Umarım faydalı olmuştur. Yapılar hakkında daha fazla bilgi için kaynaklar bölümünde yazdığım Microsoft dokümanına bakabilirsiniz.

Bir sonraki yazımda görüşmek üzere 🙂

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik

https://docs.microsoft.com/tr-tr/dotnet/api/system.io?view=netframework-4.8

Leave a Comment