30 Aralık 2013 Pazartesi

1 - Struct - Giriş...


Modülde ki teorik anlatımı ile struct yapısı aşağıdaki gibidir...
Nesne tabanlı programlama beş veri tipini destekler. Bunlar Class, Struct, Enum, Interface ve Delegate tipleridir. Bu öğrenme faaliyetinde Yapı (struct) veri tipini ele alacağız.

Aralarında mantıksal bir ilişki bulunan ama farklı türdeki verilerin bir arada bulunması gereken durumlarla karşılaşılabilir. İşte bu durumlarda belli bir grup verinin bir arada tutulması için oluşturulan yeni birime yapı (struct) denir.

Yapılar değer türündedir. Dolayısıyla belleğin yığın (stack) bölümünde tutulurlar.

Bellek kullanım bakımından yığın (stack) ve öbek (heap) olmak üzere ikiye ayrılır.

Yığın bölümünde veriler üst üste gelecek şekilde depolanırlar. Yeni bir veri eklendiğinde bu belleğin en üst bölgesine yerleştirilir. LIFO (Last In First Out) mantığına göre çalışır. Yani son giren ilk çıkar. Verilere erişim basit olduğu için hızlıdır.

Öbek kısmında ise boş bir alan oluşturulur ve veriler rastgele yerleştirilir. Verilere erişim karmaşık olduğundan daha yavaştır.

Değer türleri belleğin yığın (stack) bölümünde tutulurken; referans türler belleğin öbek (heap) bölümünde tutulur. Örneğin sınıflar(class) referans türünde olduklarından dolayı belleğin öbek (heap) bölümünde tutulur.

Yapıları tanımlamak için ‘struct’ anahtar sözcüğünü kullanırız. Bir yapının genel tanımlanma şekli aşağıdaki gibidir.
struct yapi-ismi
{
    yapi-elemanlari-listesi;
}

Genel tanımdan sonra söylenebilecek olan durum şudur... Structlar çok yoğun bir şekilde işlemciyi veya belleği yoracak olan durumlarda kullanılır... Çünkü kullanıldıktan sonra bellekten silinir... Böyle olunca sistemi yormaz... Onun dışında aslında classlardan her hangi bir farklılıkları yoktur... Hatta class kullananlar için struct kullanımı performans istemiyorsa gerekmektedir... 

Aşağıda basit bir örnek yapılmıştır... Bu örnek normalde struct kullanılmadan da rahatlıkla yapılabilir... Veri girişi için giris adında bir adet struct tanımlanmıştır... Structların içerisinde değişkenler tanımlanabildiği gibi metodlarda tanımlanabilir... 

Giris structın da tanımlanan goster adındaki metoda gelen bilgiler ekranda sonuc olarak gösterilmektedir... Structı çağırmak için yeni nesne tanımlaması kullanılmalıdır... 

giris gondermesaj = new giris();

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        struct giris
        {
            // Tanımlama sırasında public erişim seçeneği kullanılarak her yerden ulaşılması sağlanmaktadır... 
            public string goster(int no, string ad, string soyad, int yas)
            {
                string mesaj = "Numarası = " + no + "... Adı = " + ad + "... Soyadı = " + soyad + "... Yaşı =  " + yas + "..."; 
                return mesaj; // Structan geri dönecek olan bilgidir... 
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            giris gondermesaj = new giris(); // Bir nesneyi çağırır gibi gondermesaj adında bir tanımlama yapıyoruz... 
            MessageBox.Show(gondermesaj.goster(int.Parse(textBox1.Text), textBox2.Text, textBox3.Text,    int.Parse(textBox4.Text))); // Bilgiler içerisinde sayı olanlar structa, int.parse ile gönderilmektedir...
        }
    }
}

Yine aynı şekilde yapılmış olan aşağıdaki örnekte ise struc içerisinde değişkenler tanımlanmıştır... Bu yapı içerisindeki değişkenlerde sırası ile çağrılmıştır... Bu kullanıma bakılırsa daha çok değişkenlerin karmaşasını ortadan kaldıran bir yapıdadır...

struct ogrenci
        {
            public string ad; // Her yerde kullanılması için Public tanımlama yapılmıştır... 
            public string soyad;
            public string sınıf;
            public int no;
          }
        ogrenci ogren = new ogrenci(); // ogren adında structı kullanacak yapı tanımlanıyor...
        private void Form1_Load(object sender, EventArgs e)
        {
            ogren.ad = "ibrahim"; // Structa bilgiler gönderiliyor...
            ogren.soyad = "delibalta";
            ogren.sınıf = "2-c";
            ogren.no = Convert.ToInt16("1453");
        }
        private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Add(ogren.ad);// Structa gönderilen bilgiler listboxda gösteriliyor...
            listBox1.Items.Add(ogren.soyad);
            listBox1.Items.Add(ogren.sınıf);
            listBox1.Items.Add(ogren.no);
        }