Merhaba arkadaşlar,
Bu yazımızda C# programlama dilimizin özelliklerinden biri olan Struct(Yapı)'lara bakacağız.Struct'lar değer tipli verilerdir.Tanımlama bakımından ve içerisinde bulundurduğu özellikleri göz önüne alırsak class'larla aynı benzerlikleri gösterdiğini söyleyebiliriz.Aralarındaki en önemli temel fark struct'ların değer tipli class'ların ise referans tipli olmasıdır.Yapı tanımlamaları struct anahtar sözcüğü ile tanımlanmaktadır yani class anahtar kelimesi yerine struct yazılmaktadır. Elimizdeki verilere bazen referans yardımıyla ulaşmak performans kaybına yol açabilir.Bildiğiniz gibi referans tipli veriler bellekte 2 ayrı bölümde bulunmaktaydı.Referans olan tipin verisi belleğin Heap alanında bulunurken bu heap'deki referansın adı da belleğin Stack adı verilen bölümde bulunarak Heap'daki referansın adresini saklamaktaydı.Değer tipli verilerimiz de ise böyle birşey söz konusu değildi.Değer tipli verilerin kendisi Stack bölgesinde bulunurlardı.Class ve Struct arasındaki temel fark budur yani bellekte tutuluş şekilleridir.Stack alanında bulunan bir değişken için işlem yapmak belleğin diğer bölümü olan Heap'e göre oldukça hızlı olmaktadır.İçerisinde basit işlemler olacağı zaman class yerine struct tanımlamak performans açısından oldukça faydalıdır.Çünkü Struct'lar değer tipli olduğundan belleğin Stack'inde bulunduğundan veri üzerinde işlem yapmak daha hızlıdır !.
Temel olarak bir Struct tanımlaması aşağıdaki gibidir.
struct Yapimiz
{
//Özelliklerimiz
}
Tanımladığımız Struct içerisine varsayılan bir metot yani Default Constructor yazamayız.Ama parametre vererek parametreli bir yapıcı metot oluşturabilir.Aşağıda 3 adet özelliği olan bir Struct'ın oluğunu görüyoruz.
struct Yapimiz
{
public string _ad;
public string _soyad;
public string _yas;
}
Bu tanımladığımız struct'a 3 adet parametli bir yapıcı metot yazabiliriz.Default yapıcı metotodun yazılamadığını söylemiştik !
struct Yapimiz
{
public string _ad;
public string _soyad;
public int _yas;
public Yapimiz(string ad,string soyad,string yas)
{
_ad = ad;
_soyad = soyad;
_yas = yas;
}
}
Görüldüğü gibi struct tanımlamaları class'lara benzemektedir.Programlama sırasında oluşturduğumuz Struct'ı tanımlamak için new anahtar kelimesi kullanılır.new anahtar sözcüğü ile tanımlanınca bizim yazmış olduğumuz yapıcı metodu veya varsayılan yapıcı metodu üzerinden işlem yapabiliriz.Fakat class'lardan farklı olarak new anahtar sözcüğü kullanmadan da struct'ımız üzerinden nesne tanımlanabilir.Nesneyi varsayılan yapıcı metot ile tanımlarsak struct'ımızdaki alanlara otomatik olarak varsayılan değerle atanır.Yani örnek vermek gerekirse int bir alana 0'ın atanması gibi !.
class Program
{
static void Main(string[] args)
{
Yapimiz personel1 = new Yapimiz();
Console.WriteLine(personel1._yas);
Console.WriteLine(personel1._ad);
}
struct Yapimiz
{
public string _ad;
public string _soyad;
public int _yas;
}
}
Yukarıdaki kodun ekran çıksında ilk ekrana yazılan değer 0 ve ikinci değerde null olduğundan ekranda gözükmeyecektir.Parametre üzerinden biz değer atamadığımızdan default değerler verilmiştir.
Class ile Struct arasındaki diğer fark ise yapıların türetmeye destek vermediğidir.Class'lar bildiğiniz gibi kalıtıma destek vererek kalıtıldığı sınıfın belirlenmiş özellikleri üzerinden işlem yapabiliyordu.Örneğin aşağıdaki şekilde Yapimiz Struct'ımızı PersonelBaseStruct adındaki struct'tan kalıtmak istediğimizde derleme aşamasında hata alarak bu işlemi gerçekleştiremeyiz.
struct Yapimiz:PersonelBaseStruct
{
public string _ad;
public string _soyad;
public int _yas;
}
İçerisinde özellikleri ve parametreli yapıcı metodu bulunan bir struct tanımlayıp programlama sırasında nesne tanımlayıp varsayılan yapıcı metodun parametrelerine değerleri verip yapımızı kullanarak atadığımız değeri ekrana yazdıralım.
class Program
{
static void Main(string[] args)
{
Yapimiz personel1 = new Yapimiz("Serhat", "Taş", 20);
Console.WriteLine("Ad:{0}\nSoyad:{1}\nYaş:{2}",personel1.Ad,personel1.Soyad,personel1.Yas);
Console.ReadLine();
}
struct Yapimiz
{
private string _ad;
private string _soyad;
private int _yas;
public string Ad
{
get { return _ad; }
set { _ad = value; }
}
public string Soyad
{
get { return _soyad; }
set { _soyad = value; }
}
public int Yas
{
get { return _yas; }
set { _yas = value; }
}
public Yapimiz(string ad,string soyad,int yas)
{
_ad = ad;
_soyad = soyad;
_yas = yas;
}
}
}
Yukarıdaki program çalıştığında yapımızın özelliklerini kullanarak verilerimizi ekrana yazabiliriz.
Bu makalemizde Struct kavramını kısaca anlatmak istedim.Faydalı olması dileğiyle iyi çalışmalar :)
Serhat TAŞ