C#

C# struct Yapısı

Herkese merhaba, C# yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda struct anahtar kelimesi hakkında bilgi vereceğim. Hadi başlayalım !

struct Nedir ?

Yapılar (structs), birbirleriyle ilişkili farklı veri türlerini bir araya getirerek bir veri yapısı oluşturmanıza olanak tanır. C# programlama dilinde yapılar, sınıflarla benzerlik gösterir ancak bazı farklılıklar vardır. Örneğin, yapılar sınıflar gibi nesne yönelimli programlamada kullanılabilir ancak yapılar değer türleridir (value types), sınıflar ise başvuru türleridir (reference types).

Yapılar, genellikle basit veri tipleri veya daha küçük veri yapıları için kullanılır. C#’da yapılar, veri taşıma amacıyla sıklıkla kullanılır. Örneğin, bir koordinat yapısı, bir rengin RGB bileşenlerini tutan bir yapı veya bir işlemci kaydı yapısı gibi kullanımları vardır.

Yapıların sınıflara göre bazı avantajları vardır. Yapılar, bellek kullanımını ve kod yürütme süresini azaltabilir. Ayrıca yapılar, C#’ın temel veri türlerine benzer şekilde çalıştığı için işlemci üzerinde daha hızlı çalışabilir. Bu nedenle, yapılar, performans gerektiren uygulamalarda yaygın olarak kullanılır.

struct Oluşturma Yapısı

C# programlama dilinde yapılar, aşağıdaki şekilde tanımlanabilir:

struct YapiAdi
{
   // Yapı özellikleri (fields) burada tanımlanır
}

Örneğin, bir Koordinat yapısı aşağıdaki şekilde tanımlanabilir:

struct Koordinat
{
   public int X;
   public int Y;
}

Bu yapı, iki tamsayı tipi olan “X” ve “Y” adında iki özelliğe sahiptir. Bu özellikler, yapıdan bir nesne oluşturulduğunda kullanılabilir hale gelir.

Koordinat koordinat = new Koordinat();
koordinat.X = 10;
koordinat.Y = 20;

Yukarıdaki kod örneği, “Koordinat” yapısından bir nesne oluşturur ve bu nesnenin “X” ve “Y” özelliklerine 10 ve 20 değerlerini atar.

Constructor Metodlu structlar

Ayrıca, yapılar sınıflar gibi kurucu (constructor) yöntemlerine de sahip olabilir. Yapı kurucu, bir yapı nesnesi oluşturulduğunda otomatik olarak çağrılır ve yapı özelliklerini varsayılan değerlerle başlatır. Aşağıdaki kod örneği, “Koordinat” yapısı için bir kurucu yöntem göstermektedir:

struct Koordinat
{
   public int X;
   public int Y;

   public Koordinat(int x, int y)
   {
      X = x;
      Y = y;
   }
}

Yukarıdaki kod, “Koordinat” yapısı için bir kurucu yöntemi tanımlar ve bu yöntem, iki tamsayı tipi olan “x” ve “y” parametrelerini alır. Bu kurucu yöntemi kullanarak, bir Koordinat yapısı nesnesi aşağıdaki şekilde oluşturulabilir:

Koordinat koordinat = new Koordinat(10, 20);

Bu kod, “Koordinat” yapısından bir nesne oluşturur ve bu nesnenin “X” ve “Y” özelliklerine 10 ve 20 değerlerini atar.

struct İçine Property ve Fonksiyon Ekleme

Yapılar, sınıflarda olduğu gibi özellikler (properties), metotlar (methods) ve indeksler (indexers) içerebilir. Özellikler, yapının içindeki özelliklerin değerlerini değiştirmek veya okumak için kullanılır. Metotlar, yapının davranışını tanımlayan işlevlerdir. İndeksler, yapının içindeki öğelere erişmek için kullanılır.

Aşağıdaki örnek, “Koordinat” yapısı için bir özellik, bir metot ve bir indeks tanımlar:

struct Koordinat
{
   private int _x;
   private int _y;

   public int X
   {
      get { return _x; }
      set { _x = value; }
   }

   public int Y
   {
      get { return _y; }
      set { _y = value; }
   }

   public int Toplam()
   {
      return _x + _y;
   }

   public int this[int index]
   {
      get
      {
         if (index == 0)
            return _x;
         else if (index == 1)
            return _y;
         else
            throw new IndexOutOfRangeException();
      }
      set
      {
         if (index == 0)
            _x = value;
         else if (index == 1)
            _y = value;
         else
            throw new IndexOutOfRangeException();
      }
   }
}

Yukarıdaki örnek, “Koordinat” yapısı için “X” ve “Y” özelliklerini ve “Toplam” adında bir metot tanımlar. Ayrıca, “this” anahtar kelimesini kullanarak, yapının indekslerini tanımlar.

Örneğin, aşağıdaki kod, “Koordinat” yapısından bir nesne oluşturur, X ve Y özelliklerine değerler atar ve Toplam metotunu çağırır:

Koordinat koordinat = new Koordinat();
koordinat.X = 10;
koordinat.Y = 20;
int toplam = koordinat.Toplam(); // toplam = 30

Aşağıdaki kod, “Koordinat” yapısının indekslerini kullanarak X ve Y değerlerini okur ve değiştirir:

Koordinat koordinat = new Koordinat();
koordinat[0] = 10; // X özelliği 10 olarak ayarlanır
koordinat[1] = 20; // Y özelliği 20 olarak ayarlanır
int x = koordinat[0]; // x = 10
int y = koordinat[1]; // y = 20

Kısıtlamalar

Yapılar, sınıflarla karşılaştırıldığında bazı kısıtlamalara sahiptir. Örneğin, yapılar, kalıtım (inheritance) yapamazlar ve bu nedenle, bir yapı, başka bir yapıdan veya sınıftan kalıtım alamaz. Yapılar, ayrıca, yalnızca değer tipleri olarak geçirilebilirler. Bu, yapıların, referans tipleri olan sınıfların aksine, bellekte farklı şekilde tutulduğu anlamına gelir. Yapılar, değer tipleri olarak geçirildiğinde, bellekteki değerleri doğrudan kopyalanır. Bu nedenle, yapıların kopyalanması, örneğin bir fonksiyondan başka bir fonksiyona geçirilirken, bellek kullanımını artırabilir.

Aşağıdaki örnek, “Koordinat” yapısından bir nesnenin, değer tipleri olarak geçirildiği bir fonksiyonu göstermektedir:

void KoordinatYazdir(Koordinat koordinat)
{
   Console.WriteLine("X: " + koordinat.X + ", Y: " + koordinat.Y);
}

Koordinat koordinat = new Koordinat();
koordinat.X = 10;
koordinat.Y = 20;
KoordinatYazdir(koordinat);

Yukarıdaki kod, “KoordinatYazdir” adında bir fonksiyon tanımlar ve bu fonksiyon, “Koordinat” yapısından bir nesneyi parametre olarak alır. Bu fonksiyon, nesnenin X ve Y özelliklerini konsola yazdırır. Daha sonra, “koordinat” adında bir nesne oluşturulur ve bu nesne, X ve Y özelliklerine değerler atanır. Son olarak, “KoordinatYazdir” fonksiyonu çağrılır ve “koordinat” nesnesi bu fonksiyona parametre olarak geçirilir.

readonly İle Kullanımı

“readonly” (salt okunur) özelliklerini desteklerler. Bu özellik, yapının tanımlandığı yerde veya yapının bir alanı veya özelliği tanımlandığı yerde, değerlerinin değiştirilemez olduğunu belirtir. Böylece, bir yapı nesnesinin salt okunur özelliği veya alanı, sadece nesne oluşturulduktan sonra değer atanabilir. Aşağıdaki örnek, bir yapıda salt okunur bir özellik kullanımını gösterir:

struct Ogrenci
{
    public string Ad;
    public readonly int Numara;
    public Ogrenci(string ad, int numara)
    {
        Ad = ad;
        Numara = numara;
    }
}

Ogrenci ogrenci = new Ogrenci("Ali", 12345);
ogrenci.Ad = "Ahmet"; // geçerli
ogrenci.Numara = 67890; // hata: salt okunur özellik değiştirilemez

interface İle Kullanımı

C# dilinde “interface” (arayüz) adı verilen bir yapı oluşturma mekanizmasıyla kullanılabilirler. Bir arayüz, bir yapıda tanımlanabilen özelliklerin ve metotların bir listesidir. Arayüzleri kullanarak, farklı yapılar arasında bir tür sözleşme veya protokol belirleyebilirsiniz. Aşağıdaki örnek, bir arayüzü tanımlayan ve bir yapıda bu arayüzü uygulayan bir kod gösterir:

interface ISekil
{
    double Alan { get; }
    double Cevre { get; }
}

struct Dikdortgen : ISekil
{
    public double Uzunluk;
    public double Genislik;

    public double Alan { get { return Uzunluk * Genislik; } }
    public double Cevre { get { return 2 * (Uzunluk + Genislik); } }
}

Dikdortgen dikdortgen = new Dikdortgen { Uzunluk = 10, Genislik = 5 };
Console.WriteLine("Alan: " + dikdortgen.Alan); // Alan: 50
Console.WriteLine("Çevre: " + dikdortgen.Cevre); // Çevre: 30

Yukarıdaki kod, “ISekil” adında bir arayüz tanımlar ve bu arayüz, “Alan” ve “Cevre” adında iki özellik tanımlar. Daha sonra, “Dikdortgen” adında bir yapı tanımlanır ve bu yapı, “Uzunluk” ve “Genislik” adında iki özellik içerir. Ayrıca, “Dikdortgen” yapısı, “ISekil” arayüzünü uygular ve “Alan” ve “Cevre” özelliklerinin her ikisini de uygular.

class vs struct

Bazen sınıflardan daha az esnek olabilirler. Örneğin, bir yapı, bir sınıfın yaptığı gibi, birden fazla kalıtım almaz. Yapılar, yalnızca bir arayüzü uygulayabilirler ve ancak bu şekilde birden fazla özellik seti sağlanabilir. Ayrıca, yapılar, sınıfların yapabildiği gibi, “virtual” (sanal) veya “abstract” (soyut) yöntemleri veya olayları tanımlayamazlar.

Sonuç

C# yapıları, bazı kısıtlamalarına rağmen, özellikle küçük ve basit veri tiplerini temsil etmek için kullanışlıdır. Ayrıca, C# dilinde bulunan bazı veri tipleri, aslında yapılar olarak tanımlanmıştır.

Sonuç olarak, C# yapıları, değer tiplerini temsil etmek için kullanışlı bir araçtır. Yapılar, sınıfların yapabileceği birçok işi yapabilirler ve “readonly” özelliği ve arayüzleri destekleyerek, daha esnek bir programlama deneyimi sunarlar. Ancak, yapıların sınıflardan daha az esnek olması nedeniyle, kullanımı özenli bir şekilde düşünülmelidir.

Evet C# dilinde struct yapısı bu şekilde kullanılmakta. Tüm C# yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.

Skorumuz:
Oy Vermek İçin Tıklayın
[Toplam: 0 Ortalama: 0]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu