14 Nisan 2010 Çarşamba

Object Oriented Programming (16) - Constructors, Destructor

Constructors, Destructor


Yapıcı metodlar olarak adlandırılan Constructor'lar nesne yönelimli programlamada çok büyük öneme sahiptir. Constructor'lar(Yapıcı Metodlar), Class üzerinden oluşturulan her bir nesnenin(Object) ilk çalışacak void'leridir. Her nesne en az bir Constructor'a sahiptir. Bu constructor Default Constructor(Varsayılan Yapıcı Metod) olarak adlandırılır. Bunun dışında isteğe göre parametrik Constructor'lar oluşturulabilir.

Constructor'lar genellikle bir nesnenin field'larına başlangıç değerleri atamak için kullanılır.

Constructor'lar Class üzerinden nesne oluşturulduğu zaman Common Language Runtime (CLR) tarafından otomatik olarak çalıştırılır.

Constructor Tanımlamak

Constructor tanımlarken aşağıdaki adımlara dikkat edilmesi gerekir. Bunlar;

• Constructor isimleri Class ile aynı olmalıdır.
• Constructor'lar geriye değer döndürmez. Fakat Constructor'lar parametre değerleri alabilirler. Bu parametreleri belirlerken method overload kuralları(parametre sayı ve türlerinin farklı olması) geçerli olur. Default Constructor parametre değeri almaz.

Aşağıda Constuructor tanımlaması gösterilmektedir.

access-modifier class-adı(parametre-listesi)
{


}

Aşağıdaki örnekte _uzunluk adlı field'ın başlangıç/varsayılan değerini sekiz yapan, Default Constructor tanımı yapılmaktadır.

//Constructor
public Sifre()
{
  _uzunluk = 8;
}


//Field
private int _uzunluk;


//Property
public int Uzunluk
{
get { return _uzunluk; }
set { _uzunluk = value; }
}

Aşağıdaki örnekte _uzunluk adlı field'ın değerini Class üzerinden Nesne oluşturulurken alan , Parametrik Constructor tanımı yapılmaktadır.

//Constructor
public Sifre(int UzunlukDegeri)
{
    _uzunluk = UzunlukDegeri;
}


//Field
private int _uzunluk;


//Property
public int Uzunluk
{
get { return _uzunluk; }
set { _uzunluk = value; }
}

Aşağıdaki örnekte _uzunluk ve _sifreTipi adlı field'ların değerini Class üzerinden Nesne oluşturulurken alan , farklı bir Parametrik Constructor tanımı yapılmaktadır.

//Constructor
public Sifre(int UzunlukDegeri, SifreKarakterTipi SifreTipiDegeri)
{
_uzunluk = UzunlukDegeri;
_sifreTipi = SifreTipiDegeri;
}


//Field
private int _uzunluk;
private SifreKarakterTipi _sifreTipi;


//Property
public int Uzunluk
{
get { return _uzunluk; }
set { _uzunluk = value; }
}


public SifreKarakterTipi SifreTipi
{
get { return _sifreTipi; }
set { _sifreTipi = value; }
}

Constructor ekledikten sonra Sifre Class'ının son hali aşağıdaki gibidir.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace SifreUretici
{


//Enum
public enum SifreKarakterTipi
{
     Basit, Kompleks, Ozel
}


public class Sifre
{


//Constructor
public Sifre()
{
    _uzunluk = 8;
}


public Sifre(int UzunlukDegeri)
{
     _uzunluk = UzunlukDegeri;
}


public Sifre(int UzunlukDegeri, SifreKarakterTipi SifreTipiDegeri)
{
      _uzunluk = UzunlukDegeri;
      _sifreTipi = SifreTipiDegeri;
}

//Field
private int _uzunluk;
private SifreKarakterTipi _sifreTipi;

//Property
public int Uzunluk
{
get { return _uzunluk; }
set { _uzunluk = value; }
}


public SifreKarakterTipi SifreTipi
{
    get { return _sifreTipi; }
    set { _sifreTipi = value; }
}


//Method
public string SifreUret()
{
char[] karakter = { 'A','B','C','D','E','F','G','H','I', 'J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','!','@','?','$'};
Random rnd = new Random();
string sonuc = null;
for (int i = 1; i <= _uzunluk; i++)
{
int rastgeleSayi = 0;
if (_sifreTipi == SifreKarakterTipi.Basit)
{
rastgeleSayi = rnd.Next(0, 25);
}
else if (_sifreTipi == SifreKarakterTipi.Kompleks)
{
rastgeleSayi = rnd.Next(0, 61);
}
else if (_sifreTipi == SifreKarakterTipi.Ozel)
{
rastgeleSayi = rnd.Next(0, karakter.Length - 1);
}
sonuc += karakter[rastgeleSayi].ToString();
}
return sonuc;
}
} //Class
} //NameSpace

Constructor'lar ekledikten sonra Sifre Class'ının Class View'da ki görüntüsü aşağıdaki gibi olacaktır.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Destructor(Yıkıcı Metod), Constructor'ın tersine nesne(object) yok edilirken devreye giren void'lerdir. Genelde bellek temizleme işlemlerinde yardımcı olmak amacıyla kullanılır. Aslında Visual Studio .NET de bellek yönetiminden Garbage Collector(GC) sorumludur. Destructor sadece Garbage Collector'ın manuel bir şekilde kullanılmasını sağlar. İşlem bittikten sonra Garbage Collector tarafından ilgili nesne bellekten kaldırılır.

Çöp toplama aracı olarak da bilinen Garbage Collector(GC), bellek yönetiminden sorumlu araçtır. GC servisi, bellek üzerinde allocate(yeni nesnelere yer açma) ve deallocate(bellekte uygun alanları serbest bırakma) işlemlerini gerçekleştirir. Ayrıca uzun süre erişilmeyen veya kullanılmayan nesneleri bellekten kaldırma, oluşturulan yeni nesneler için heap üzerinde yer açma gibi işlemleri de yerine getirir.

Daha önceki Microsoft uygulamalarında(Visual Basic), nesneyi bellekten temizlemek için nesneye Nothing değeri atıyorduk.

x = Nothing

Fakat bu işlem; nesneye Nothing değerini atamayı unutmamız, bağlı nesneleri yönetimi zorlaştırma gibi problemlere yol açmaktaydı. GC bu tür problemlerin hepsini ortadan kaldırarak bellek yönetimini otomatik hale getirir.

Bellek yönetimini daha etkin hale getirebilmek için GC'yi manuel olarak kontrol etmek gerekebilir. GC'nin manuel kontrol edilmesi Interface bölümünde daha detaylı ele alınacaktır.

Destructor Tanımlamak

Destructor tanımlarken aşağıdaki adımlara dikkat edilmesi gerekir. Bunlar;

• Destructor isimleri "~"(tilde) karakteri ve Class adının birleşimiyle oluşur. Ör ~Sifre().
• Destructor'lar parametre almaz ve geriye değer döndürmez.
• Bir Class içerisinde sadece bir Destructor tanımı yapılabilir.

Aşağıda Destructor tanımlaması gösterilmektedir.

~class-adı()
{


}

Aşağıdaki örnekte Sifre Clası için Destructor tanımı yapılmaktadır.

~Sifre()
{
// Finalize gerçekleşmeden önce yapılması
// gereken işlemler burada gerçekleştirilir
}

Destructor ve GC'nin manuel kullanımı Interface bölümünde detaylı bir şekilde ele alınacaktır.

Hiç yorum yok: