C Sharp Programlama Dili/Yapılar

Vikikitap, özgür kütüphane
Ders 14. Yapılar


Sizce int, double, byte birer nedir? "Sınıftır!" dediğinizi duyar gibiyim. Yaklaştınız ancak tam olarak sınıf değil. Temel veri türleri (int, double, vb.) birer yapıdır. int türünden tanımladığımız bir a değişkeni/özelliği de bir yapı nesnesidir. Peki sınıf ile yapı arasında ne fark var? Aşağıdaki kodu inceleyiniz

 int a=5;
 Sinif b=23;

Buraya kadar ikisi de birbirinin aynısı gibi. Bu koddan Sinif sınıfının içinde bir implicit metot olduğunu ve atanan değerin sınıf içindeki int türünden bir özelliğe atandığını çıkarabiliriz. Şimdi bu kodu şöyle geliştirelim:

 int a=5;
 Sinif b=23;
 int c=a;
 Sinif d=b;
 a=10;
 b=100;
 Console.WriteLine("{0}-{1}-{2}-{3}",a,b.Sayi,c,d.Sayi);

Bu kodda int c=a; satırında a'nın tuttuğu değer c'ye atanır. Sinif d=b; satırında ise d nesnesi b nesnesinin bellekteki adresini bulur ve o adresteki değeri tutar. Gördüğünüz gibi sınıf nesneleri birbirine adres gösterme yoluyla atanırken yapı nesneleri birbirine değer kopyalama yoluyla atanır. Bu kodda b nesnesinde yapılan bir değişiklik d nesnesini, d nesnesinde yapılan bir değişiklik de b nesnesini etkileyecektir. Ancak c nesnesinde yapılan bir değişiklik a nesnesini, a nesnesinde yapılan bir değişiklik de c nesnesini etkilemeyecektir.

Kendimiz de int, float gibi yapılar oluşturabiliriz. Yapı yaratmak sınıf yaratmaya oldukça benzer, yalnızca class anahtar sözcüğü yerine struct anahtar sözcüğü kullanılır. Örnek:

 struct YapiAdi
 {
    public int Ozellik1;
    public string Ozellik2;
 }

Yapılarla ilgili bilmeniz gerekenler:

  • Tıpkı sınıflar gibi yapılarda da new operatörüyle nesne yaratılabilir. new anahtar sözcüğünü kullandığımızda yapının varsayılan yapıcı metodu veya varsa kendi tanımladığımız yapıcı metot çalıştırılır.
  • Sınıflardan farklı olarak YapiAdi nesne; yazarak bir yapı nesnesini oluşturup kullanılabilir hâle getirebiliriz. İllaki new anahtar sözcüğünü kullanmak zorunda değiliz. Ancak bu durumda nesnenin herhangi bir özelliğine erişmek için nesne oluşturduktan sonra bizim bu özelliğe bir değer atamamız gerekir. Örnek:
YapiAdi nesne;
nesne.Ozellik1=5;
Console.WriteLine(nesne.Ozellik1);
  • Yapı nesnesi oluştururken new anahtar sözcüğünü kullanırsak o yapıdaki bütün özellikler varsayılan değerine atanır.
  • Bir yapı türündeki nesne bir metoda parametre olarak gönderildiğinde metodun içinde nesnenin değiştirilmesi esas nesneyi değiştirmez. Ancak sınıf nesnelerinde değiştirir.
  • Yapılardaki özelliklere yapı içinde ilk değer verilemez (const özellikler hariç).
  • Tıpkı sınıflardaki gibi yapılarda da birden fazla yapıcı metot yaratabiliriz. Ancak yapılarda parametre almayan bir yapıcı metot bildiremeyiz. Hatırlarsanız sınıflarda bildirebiliyorduk. Ayrıca yapılarda parametre alan bir yapıcı metot oluşturmamız, varsayılan yapıcı metodun oluşturulmasını engellemez. Bir yapıda parametre alan bir yapıcı metot oluşturmuş olsak bile Yapi nesne=new Yapi(); şeklinde parametre almayan yapıcı metodu çağırabiliriz.
  • Bir yapının yapıcı metodu bildirildiğinde yapıcı metodun içinde yapının bütün özelliklerine (private olanlar da dahil) ilk değer verilmesi gerekir.
  • Yapı nesnelerinin faaliyet alanı sonlandığında otomatik olarak bellekten silinirler. Hatırlarsanız sınıf nesnelerinin faaliyet alanı sonlandığında garbage collection (çöp toplama) mekanizması devreye giriyordu. Ancak garbage collection mekanizmasının nesnenin faaliyet alanı sonlanır sonlanmaz devreye girme garantisi yoktu. Özetle sınıf nesnelerinin aksine yapı nesnelerinin tam olarak ne zaman bellekten silindiğini anlayabiliriz.
  • Yapılarda yıkıcı metot yaratılması yasaklanmıştır.
  • Sınıflarda olduğu gibi yapılarda da sahte özellik (get ve set bloklu özellik) ve indeksleyici kullanabiliriz.
  • Yapı nesneleriyle ilgili işlemler, sınıf nesneleriyle ilgili işlemlerden daha hızlı gerçekleşir.
  • Tıpkı sınıflardaki gibi normal metotlar da bir yapı içerisinde bildirilebilir. Ayrıca üye elemanlar static olabilir.
  • Tıpkı sınıflardaki gibi bir yapı içerisindeki özellikler const ya da readonly olabilir.
  • const özelliklere tanımlandığı satırda değer verilmesi gerekir. readonly özelliklere ise tanımlandığı satırda değer verilmemesi gerekir. readonly özelliklerin değerleri yapıcı metot içinde belirtilebilir. Yapıcı metot oluşturulmuşsa readonly özelliğe yapıcı metot içinde ilk değer verilmesi gerekir (aslında yapıcı metot oluşturulmuşsa diğer özelliklere de yapıcı metot içinde ilk değer verilmesi gerekir). const ve readonly özelliklerin değerleri nesne oluşturulduktan sonra değiştirilemez.
  • const özelliklerin değerleri yapıcı metot içinde değiştirilemez.
Bu kitabın diğer sayfaları
  • Sınıflar
  • Operatör aşırı yükleme
  • İndeksleyiciler
  • Yapılar
  • Enum sabitleri
  • İsim alanları
  • System isim alanı
  • Temel I/O işlemleri
  • Temel string işlemleri
  • Kalıtım
  • Arayüzler
  • Partial (kısmi) tipler
  • İstisnai durum yakalama mekanizması
  • Temsilciler
  • Olaylar
  • Önişlemci komutları
  • Göstericiler
  • Assembly kavramı
  • Yansıma
  • Nitelikler
  • Örnekler
  • Şablon tipler
  • Koleksiyonlar
  • yield
  • Veri tabanı işlemleri
  • XML işlemleri
  • Form tabanlı uygulamalar
  • Visual Studio.NET
  • Çok kanallı uygulamalar
  • ASP.NET