set ve get anahtar sözcüklerinin kullanımı
Bir önceki makalede C#.NET'te sınıfların oluşturulmasından ve sınıflara metotların, özelliklerin eklenip nasıl çağırıldığından bahsetmiştim. Bu makalede C#.NET'te yeniden sınıfların oluşturulması konusuna bakacağız. Bu sefer C#'ın sınıf oluşturulmasında bizler için sunduğu olanakları daha fazla kullanarak daha verimli bir çalışma yapacağız. Bir önceki sipariş örneğini geliştirerek makaleye başlamak istiyorum.
Sipariş sınıfının görevi siparişleri alıp veritabanına kaydetmek olsun. Bir siparişte sipariş verenin adı, email, telefon, adres, sipariş edilen ürün, sipariş edilen ürün adedi, birim fiyat bilgileri yer alır. Öncelikle bu propertiesleri sınıfın içinde belirleyelim.
class Siparis
{
private string m_AdSoyad;
private string m_Adres;
private string m_Telefon;
private string m_Email;
private string m_UrunAdi;
private int m_Adet;
private int m_BirimFiyat;
}
Biz bu classa dışarıdan erişip bu özelliklere bir takım değerler atadığımızda bunların geçerliliğini de kontrol etmeliyiz. Örneğin email adresinin doğru formatta girilmesi ya da telefon bilgisinin boş geçilmesi durumunda işlemin yapılmaması gibi. Aynı zamanda sadece değer ataması değil, bu classın içindeki özelliklerin var olan değerlerinin de dışarıdan okunması gerekir. O halde bir özelliğe atanan değeri kontrol eden ve bu değeri okuyan iki ayrı metoda ihtiyacımız var.
class Siparis
{
private string m_AdSoyad;
private string m_Adres;
private string m_Telefon;
private string m_Email;
private string m_UrunAdi;
private int m_Adet;
private int m_BirimFiyat;
public int Adet()
{
return m_Adet;
}
public void Telefon(string telefon)
{
if (telefon == string.Empty)
{
m_Telefon = "Geçersiz";
}
else
{
m_Telefon = telefon;
}
}
}
Yukarıdaki örnekte Adet() metodu bize sınıf içindeki adet bilgisini geri döndürür. Telefon(string telefon) metodu da sınıfın m_Telefon özelliğine değer ataması yapılırken bir kontrol işlemi vazifesi görür.
C#'da bir sınıfın üye elemanlarının her biri için bu şekilde ikişer adet metodun yazılması yerine set ve get anahtar sözcüklerinin kullanımı ile bu ayarlamayı yapabiliyoruz. Yukarıdaki metod ile aynı amaca hizmet edecek olan set ve get anahtar sözcükleri ile hazırlanmış metodların kullanımı aşağıdaki gibi olacaktır.
class Siparis
{
private string m_AdSoyad;
private string m_Adres;
private string m_Telefon;
private string m_Email;
private string m_UrunAdi;
private int m_Adet;
public string Telefon
{
get { return m_Telefon; }
set
{
if (value == string.Empty)
{
m_Telefon = "Geçersizdir.";
}
else
{
m_Telefon = value;
}
}
}
public int Adet
{
get { return m_Adet; }
set { m_Adet = value; }
}
private int m_BirimFiyat;
}
Get ve Set metodlarının hızlı bir şekilde oluşturulması için yapmanız gereken : Sınıf içindeki üye elemanın üzerine sağ tıklayıp refactor menüsünden "encapsulate field" komutunu vermektir. Karşınıza çıkan ekranlarda size default olarak bu property name oluşturulacaktır.

Burada yapılan işlemi biraz daha mercek altına alalım. Siparis sınıfının m_Telefon üyesini private olarak ayarlamıştık. Bu şekliyle ben programın Main() metodundan ya da bir başka class içinden siparis nesnesini oluşturduğumda m_Telefon özelliğine bir değer atayamazdım. Çünkü erişim belirleyicisi olarak private ayarlamıştım. Ardından Adet() ve Telefon(string telefon) metodlarıyla bir sınıfın üye özelliğine nasıl değer atanıp, bu değerin okunacağı örneğini verdim. Ardından bu metotla aynı görevi üstlenen ve okunabilirliği arttıran, yönetimi pratik set ve get anahtar sözcüklerinin kullanımını gösterdim. Dikkat ederseniz private olan sınıf üyeleri set ve get metotlarının kullanımı ile public değerinde bazı özellikler oluşturuldu.
Örneğin private string m_Telefon; özelliğini ben set ve get metotlarıyla artık public erişim belirleyicisine sahip olan public string Telefon ile erişiyorum.
public string Telefon
{
get { return m_Telefon; }
set
{
if (value == string.Empty)
{
m_Telefon = "Geçersizdir.";
}
else
{
m_Telefon = value;
}
}
}
Bu açıklamalardan sonra set ve get metodunun biraz yakından inceleyelim :
public int Adet
{
get { return m_Adet; }
set { m_Adet = value; }
}
Yukarıdaki örnekte get sözcüğünden sonra süslü parantezler içinde bize sınıfın asıl member elemanının değerini döndüren return anahtar sözcüğünü görüyoruz. Benzer şekilde set sözcüğünden sonra da sınıfın asıl member elemanına bir değer ataması yapıldığını görüyoruz. Burada yazan value ifadesi Siparis sınıfı nesnesini bir başka yerden oluşturup atayacağımız değerleri temsil eder. Hemen bu noktada programımın Main() metodunda bir siparis nesnesi oluşturuyorum ve Adet bilgisini giriyorum.

Intellisense kutucuğunda gördüğünüz gibi sınıfın public olan iki özelliğine erişiliyor. Bunlar Adet ve Telefon bilgisi. Aslında sınıfın en başında tanımladığımız m_Telefon ve m_Adet özellikleri private. Bu durumda madem private olan bu özelliklere nasıl oluyor da dışarıdan erişiliyor. Aslında bizim set ve get metodları ile oluşturduğumuz public olan tanımlamalar, sınıfın asıl üye elemanlarına değerleri taşıyan ve okuyan yardımcı elemanlardır. Sınıfın asıl özellik niteliğindeki elemanları başında m_ ifadesi olan ve private olarak belirtilmiş özellikleridir. Biz set ve get metodları oluşturarak sınıfın üye elemanlarına dışarıdan atanacak değerleri, sınıfın üye elemanlarına servis ediyoruz ve bu set get metodları içinde değerleri kontrol ediyoruz. Value ifadesi de yukarıdaki görüntüde gördüğünüz gibi s.Adet = karşılığında yazacağım değeri taşıyacak olan ifadedir.
Şimdi programı yazmaya kaldığımız yerden devam edelim. Şu an aşama aşama yapacağımız iş öncelikle tüm üye elemanlarının set ve get metodlarını oluşturmak olacaktır. Bunların içinde de örneğin ürün adedi kesinlikle sıfır olamaz ve 1 veya 1'den büyük olmalıdır. Sınıf içinde bir de tutar değerini alıp adet değeri ile çarpıp bize ödememiz gereken miktarı hesaplayan bir de metod yazacağız.
class Siparis
{
private string m_AdSoyad;
private string m_Adres;
private string m_Telefon;
private string m_Email;
private string m_UrunAdi;
private int m_Adet;
private int m_BirimFiyat;
public string AdSoyad
{
get { return m_AdSoyad; }
set { m_AdSoyad = value; }
}
public string Adres
{
get { return m_Adres; }
set { m_Adres = value; }
}
public string Telefon
{
get { return m_Telefon; }
set { m_Telefon = value; }
}
public string Email
{
get { return m_Email; }
set { m_Email = value; }
}
public string UrunAdi
{
get { return m_UrunAdi; }
set { m_UrunAdi = value; }
}
public int Adet
{
get { return m_Adet; }
set
{
m_Adet = value;
if (m_Adet != 0 || m_Adet >= 1)
{
m_Adet = value;
}
else
{
m_Adet = 0;
}
}
}
public int BirimFiyat
{
get { return m_BirimFiyat; }
set { m_BirimFiyat = value; }
}
public string OdemeYap()
{
string DonenDeger = string.Empty;
if (m_Adet == 0)
{
DonenDeger = "İşleminiz Başarısız";
}
else
{
int Toplam = m_Adet * m_BirimFiyat;
DonenDeger = "Ödeyeceğiniz Toplam Tutar : " + Toplam;
}
return DonenDeger;
}
}
Sınıfımızı oluşturduk. Şimdi main() metodu içinden nesnemizi oluşturalım ve siparişimizi verelim.
class Program
{
static void Main(string[] args)
{
Siparis s = new Siparis();
s.Adres = "Tuzla";
s.AdSoyad = "Emre KIYAK";
s.BirimFiyat = 5;
s.Email = "mail@emrekiyak.com";
s.Telefon = "0216-123-45-67";
s.UrunAdi = "Bardak";
Console.WriteLine("Sipariş adedini giriniz : ");
s.Adet = Convert.ToInt32(Console.ReadLine());
string sonuc = s.OdemeYap();
Console.WriteLine(sonuc);
Console.ReadLine();
}
}
Program çıktısı aşağıdaki gibi olacaktır

11 Aralık 2009 Cuma akşam 19:52
Mesajınızı yazabilirsiniz