7 Kasım 2014 Cuma

C# Destructor Nedir

Bugün  işleyeceğimiz konu Destructor(yıkıcı-yok edici) metot; 
konu içeriğimizin başlıkları şu şekilde olacak;
  1. Destructor nedir
  2. Söz Dizimi
  3. Destructor Özellikleri
  4. Destructor Örnek Uygulama

Destructor Nedir

 
Daha önceki yazılarımızda constructor (kurucu metotlardan bahsetmiştik) ilgili yazıya buradan ulaşabilirsiniz.Destructor (yıkıcı metot) olarak isimlendirelibilir.c# içinde bizim tanımladığımız sınıflar yada framework ile birlikte gelen yerleşik sınıfları hafızaya çıkarıp birer nesne oluşturduğumuz vakit hafızadan  silimeden hemen önce çalışan metotlardır. Destructor çağırılabilir bir metot değildir ve genel olarak bu işlemi  garbage collector denilen mekanizma  program içinde kendisi otomatik yapmaktadır. Bizim blok içinde kullanmış olduğumuz nesne yada değişkenler normal şartlarda blok sonuna gelindiğinde kapanan süslü parantez ile birlikte bellekten otomatik olarak düşerler . Sınıflar ve GC ise farklı davranış gösterirler şöyleki ; sınıflar heapta yer işgal ettiklerinden çöp toplayıcı mekanizma olan garbage collector sınıfın kullanılmadığı bir anda nesneyi kendisi otomatik temizlemektedir. Hangi sınıfın kullanılmadığına kendi içinde tutmuş olduğu sayaça bakarak karar verir  , uygun olanı siler belleği boşaltır. Bunu yapma nedeni heapta boş alanı belleğe kazandırmak içindir. Destructordan farklı olarak GC sınıfı çağırılabilir.Bazı durumlarda biz GC sınıfını çağırıp kendimiz bu temizleme işlemini yapmak istesekte GC nin bu çağrıya cevap verme süresi tam kestirilemez, genelde programları kapatırken otomatik olarak devreye girer, Şimdi Destructor söz dizimini görelim sonrasında yapacağımız bir  örnek ile konuyu biraz daha netliğe kavuşturalım

Destructor Söz Dizimi


Constructor söz Diziminden  tek farkı başına erişim belirleyicisi almaması ve tilde ~ işaretinin gelmesidir
    

 ~ MyClass()

  {
    
    buraya kodlarımızı yazarız.

   }

 

Destructor Özellikleri 



Maddeler halinde ifade edilecek olursa:
  1. Destructor metodlar çağırılamazlar  
  2.  Çağırılamadığı için aşırı yükleme hali yoktur.Overload edilemezler
  3.  Erişim belirleyicisi yoktur.
  4. Destructorlar  bir sınıf için sadece bir tane bulunur
  5. Kalıtımları yoktur miras alınamazlar
  6. Struct(yapı)larda destructor olmaz classlarda olur.

 

Destructor Örnek


visual studioda bir windows formu açalım ismine Destructor adı verelim ve formumuza  3 tane button ekleyerek text değerlerini aşağıdaki gibi girelim.




kod tarafına geçerek  orada bir class oluşturalım




classımızın içide bu şekilde şimdi butonların altına yazdığımız kodları  görelim
birinci buton sınıfı kurarken  ikincisi sınıfı silen garbage collector sınıfının metodunu çağırıyor ,üçüncüsü ise formu kapatıyor. Şimdi buton button1'e basıp sınıfı kurduğumuzda yapıcı metot çalışacak ve bizim karşımıza şöyle bir ekran gelecek.



sınıf kuruldu ve bizde mesajımızı görmüş olduk,programı kapat butonuna basarsak ekrana  bu sefer  "yine bekleriz.güle güle" mesajı gelir. Burada tuhaf gibi gelen durum şudur ki programı kapat butonun altında sadece this.Close(); metodu var ama biz programı kapatınca mesajı almış olduk ,bunun nedeni program kapanırken  sınıfında bellekten temizleniyorolması yani   ile destructor metodunun içindeki kodun çalışıyor ol masıdır, aşağıdaki resimde nesne temizlendikten sonraki  mesaj kutusunu görüyoruz



programı baştan çalıştırıp tekrar birinci butona basıp ilk mesajı aldıktan sonra  misafirleri yolcu et butonuna basarsak  tekrar "yine bekleriz.güle güle"mesajı gelir ama bu sefer programı kapat butonuna bastığımızda hiç bir mesaj almadan program sonlanmış olur. Birden fazla sınıflarla çalıştığımızda GC ile nesneleri bellekten temizlemek iyi bir yöntemdir. Evet bir makalenin daha sonuna geldik ,baska bir yazıda görüşünceye kadar sağlıcakla kalın.

2 Kasım 2014 Pazar

C# Struct(Yapı) Kavramı

Yeni bir ayda tekrar birlikteyiz, struct(yapı) konusunu ele alacağım bu yazıda içeriğimiz altta görmüş olduğunuz alt başlıklar şeklinde olacak
  • struct nedir
  • struct bildirimi nasıl yapılır
  • new anahtarı kullanımı

 

struct nedir


struct türkçeye çevirdiğimiz vakit  kelime karşılığı  olarak yapı anlamına gelmektedir. Bizde konunun  devamında yapı kelimesini kullanacağız. Yapı dediğimiz  bu kavram  c# içinde bir nesneyi temsil eden veri tipidir.örneğin sayısal bir tip olan int,short,byte vs.. birer yapıdır. Yapılar birer nesne olduğu için belli özelliklere sahiptirler bu özellik dışında alan (field-degişken) ve metotlara(yöntem-iş-parçası)sahip olabilirler.Claslara çok benzemesine   karşın aralarında bariz farklar vardır yapılar değer tiplidir,classlar ise reference tiplerdir.Bu konuya buradan göz atabilirsiniz.Değer tipleri bellekte stack alanında iken reference tip olan classlar heap(öbekte) tutulurlar.Classlar new anahtar kelimesi ile yaşam bulup belleğe çıkarlar.yapılar ise  iki kullanımada açıktır


struct bildirimi nasıl yapılır


yapıları oluşturuken sınıf bildiriminden  farklı bir şeyler yapmayız.Class kelimesi yerine struct kullanılır,ayrıca bir class içinde oluşabilir yada terside mümkündür bir yapı içinde classta olabilir fakat bir metot içinde yapı oluşturamazsınız.


<Erişim belirteci> struct <struct ismi>
{
 // kod bloğumuz burada özellik,degişken ,metot tanımlayabileceğimiz yapı bileşenleri..

}

şimdi  bu tanıma ait küçük bir kod bloğunu aşağıda gösterelim

public  struct  kitaplar
{

public string kitapAdi;
public int  kitapFiyati;

}

 yapıları programımızın kodu içinde kullanmayı görelim

 

new anahtarı ile yapı kullanımı


new c# de bellekte yeni bir nesne oluşurmak için kullanılan deyimdir.Burada nesnemiz yapı olacağı için stackte yeni bir nesne ortaya çıkacaktır, yukarıda oluşturduğumuz yapıyı  Form1_load eventinde gözlemleyelim

 private void Form1_Load(object sender, EventArgs e)
        {
           

        kitaplar yenikitap=new kitaplar();
        yenikitap.kitapAdi = "Hayat Güzeldir";
        yenikitap.kitapFiyati = 32;


       }


Bir yapıyı new olmadanda kullanabiliriz


 private void Form1_Load(object sender, EventArgs e)
        {
           

        kitaplar yenikitap;
        yenikitap.kitapAdi = "Hayat Güzeldir";
        yenikitap.kitapFiyati = 32;


       }

bu şekildeki kullanımdada yenikitap değişkenini yazıp noktaya(.) basarsanız kitap nesnemizin fieldlerine ulaşabildiğimizi görürüz peki new kullanımı ne fark yaratıyor,
farkı şu ki new ile kullanınca yenikitap.kitapAdi=null değerini  yenikitap.kitapFiyati =0; değerini otomatik olarak almış olur.kodumuzu aşağıdaki şekle getirelim



       
         private void Form1_Load(object sender, EventArgs e)
        {
       


            kitaplar yenikitap= new kitaplar();
                  
            this.Text = yenikitap.kitapAdi;
       
       
        }
 



formun başlığı boş gelecektir.eğer new anahtar kelimesini kullanmadan yazmaya kalkışırsak bu sefer değişkenlere ulaşabilsekte  başlangıç değeri vermediğimiz için hata almış olacagız.sınıflar new anahtarı olmadan  belleğe çıkamazlar new ile  sınıf  üyeleri varsayılan değerlerini alırlar  yapılar ise new  yoksa üyelerine ulaşabilsekte  başlangıç değeri atanma zorunluluğu vardır. bir sonraki yazıda görüşmek dileğiyle..