C# Struct (Yapılar)

  • 264
  • (1)
  • (5)
  • 09 Tem 2017

Karmaşık veri modelleri oluşturmak için iki farklı seçeneğiniz bulunmaktadır. Bunlardan ilki class ile veri modelleri tanımlamak, diğeri ise struct ile veri yapıları tanımlamaktır. class yani sınıf olarak tanımlı veri türleri referans tipi veriler oluşturur. Dolayısıyla belleğin Heap bölgesinde tutulurlar. struct yani yapı olarak tanımlı veri türleri ise değer tipi veriler oluşturur ve belleğin Stack bölgesinde tutulurlar.

Veri modellerine ihtiyaç duyulma sebebi ise sanal ortamda kaydedilen veya işlenen verilerin sadece metinlerden ve sayılardan ibaret olmayışıdır. Örneğin, bir öğrenciye ait birden fazla bilgi tek bir yapıda bir araya getirip kullanılabilir. Eğer kodlanacak olan programda birbirleri ile ilişkili veri türleri mevcutsa class ile referans tipi veri türleri tanımlamak gerekecektir. Ancak ilişkili herhangi bir durum yok ve verinin stack bölgesinde tutulmasını istiyorsanız veri türlerinizi struct olarak tanımlayabilirsiniz. struct veri modelleri class veri modellerinden daha hızlı çalışmaktadır.

Aşağıda bir çalışanın bazı bilgilerini tutabilecek struct tipi değişken türü tanımlanmıştır.


struct Eleman
{
    public string Ad;
    public string Soyad;
    public DateTime DogumTarihi;
    public string DogumYeri;
    public DateTime IseGiris;
    public float Maas;
}

Genel olarak struct ve class veri türleri namespace bölgesi içerisinde tanımlanır.


namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.ReadKey();
        }
    }

    struct Eleman
    {
        public string Ad;
        public string Soyad;
        public DateTime DogumTarihi;
        public string DogumYeri;
        public DateTime IseGiris;
        public float Maas;
    }
}

Ancak class içerisinde de tanımlanabilir. Bu durumda sadece o class alanında kullanılabilecektir. Tanımlanacak olan verilere değerler aşağıdaki gibi atanabilmekte ve okunabilmektedir.


Eleman eleman1, eleman2;
eleman1.Ad = "Salih";
eleman1.Soyad = "Kuzgun";
eleman1.DogumTarihi = new DateTime(1979, 4, 19);
eleman1.DogumYeri = "Ankara";
eleman1.IseGiris = new DateTime(2014, 1, 30);
eleman1.Maas = 4800.0f;
eleman2.Ad = "Merve";
eleman2.Soyad = "Kurt";
eleman2.DogumTarihi = new DateTime(1986, 6, 11);
eleman2.DogumYeri = "Yalova";
eleman2.IseGiris = new DateTime(2016, 12, 4);
eleman2.Maas = 3200.0f;

Yapıcı (Constructor) Metotların Kullanılması

class olarak tanımlı bir veri türünü new anahtar kelimesi ve yapıcı metot ile tanımlamadan kullanamazsınız. Ancak struct olarak tanımlı bir veri modelini kullanabilirsiniz. Böyle bir durumda veri modelinin elemanlarına ilk değer atanmamış olacaktır. Her elemanın varsayılan değeri ne ise o değer ile gelecektir. string değişkenleri null sayısal değişkenler 0 olarak tanımlanacaktır.

Eğer struct tanımlı veri türüne yapıcı metot tanımlarsanız ilk değerleri de belirleyebilirsiniz.


Eleman eleman;
// mevcut eleman verisinin Ad ve Soyad değerleri null olacaktır

Yapıcı metotlu bir veri türü aşağıdaki gibi tanımlanabilir.


struct Eleman
{
    public string Ad;
    public string Soyad;
    public DateTime DogumTarihi;
    public string DogumYeri;
    public DateTime IseGiris;
    public float Maas;
    
    // yapıcı metot içerisinde bütün değişkenlere ilk değer atanmalıdır
    public Eleman(string ad, string soyad, DateTime dogumTarihi, string dogumYeri,
        DateTime iseGiris, float maas)
    {
        Ad = ad;
        Soyad = soyad;
        DogumTarihi = dogumTarihi;
        DogumYeri = dogumYeri;
        IseGiris = iseGiris;
        Maas = maas;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Eleman elm1 = new Eleman("Hasan", "Karagöz", new DateTime(1977, 11, 4),
            "Burdur", new DateTime(2012, 4, 9), 3100);
        Console.ReadKey();
    }

}

Yapılarda Kapsülleme (Encapsulation)

Kapsülleme ile bir sınıf veya yapı değişkenine ait özellikleri diğer nesnelerden saklayabilirsiniz. private tanımlı bir değişkeni özelliğe bağlı get ve set metotları ile kapsüllersiniz.


struct Eleman
{
    private string ad;
    private string soyad;
    
    public string Ad
    {
        get { return ad; }
        set { ad = value; }
    }

    public Eleman(string ad, string soyad)
    {
        Ad = ad;
        Soyad = soyad;
    }
}

Burada ad değişkenine nesne dışından doğrudan erişilemez. Ancak Ad olarak tanımlanmış özellik sayesinde nesne dışından erişim sağlanır. Bu kapsülleme daha karmaşık biçimlerde yapılabilir.

Aşağıdaki örnekte yariCap değişkeninin değeri yapı dışından doğrudan belirlenemez. Alan özelliğine değer atandığı zaman yariCap değişkeni de set metodu sayesinde gereken değeri almaktadır.


struct Daire
{
    private double yariCap;

    public double Alan
    {
        get { return Math.PI * yariCap * yariCap; }
        set { yariCap = Math.Sqrt(value / Math.PI); }
    }

    public double YariCap
    {
        get { return yariCap; }
    }
}

Aşağıdaki gibi başka özelliklere bağlı sadece okunabilir (readonly) özellikler oluşturabilirsiniz. Eğer get ve set metodları standart biçimde çalışacaksa içlerini doldurmanıza gerek yoktur.


class Program
{
    static void Main(string[] args)
    {
        Dikdortgen d1 = new Dikdortgen(3, 5);
        Dikdortgen d2 = new Dikdortgen();
        d2.X = 4;
        d2.Y = 6;
        Console.WriteLine("d1' in alanı: {0}", d1.Alan);
        Console.WriteLine("d2' nin alanı: {0}", d2.Alan);
        Console.ReadKey();
    }
}

struct Dikdortgen
{
    public float X { get; set; }
    public float Y { get; set; }

    public float Alan { get { return X * Y; } }

    public Dikdortgen(float x, float y)
    {
        X = x;
        Y = y;
    }
}

İlişkili İçerikler

OOP (Object Oriented Programming) Nesne yönelimli programlamanın temelini oluşturan sınıfları inceleyebilirsiniz.

Bir sınıfın metot veya özelliklerine erişim ile ilgili belirleyici kelimeleri inceleyebilirsiniz.

Paylaşın
Etiket Bulutu