Set ve Get metotlarını birer kontrol mekanizması olarak düşünebiliriz. Olası problemleri önlemek, işlemleri güvenilir ve kontrollü bir şekilde gerçekleştirmek için Set ve Get metotlarını kullanırız.
Basit bir senaryo üzerinden konumuzu açıklamaya devam edelim. Otel otomasyonu için müşteri bilgilerini tutan bir sınıf tasarladığımızı düşünelim. Müşterinin ad-soyad, TC kimlik numarası ve oda numarası bilgilerini tutmak istiyorsak aşağıdaki gibi bir tasarım yapabiliriz.
class Musteri { public string AdSoyad; public ulong TCNo; public int OdaNo; }
Musteri sınıfının üyeleri public olarak bildirildiği için bu üyelere doğrudan erişilip değerler atanabilir. İşte bu noktada kontrolü elimize almamız lazım aksi taktirde TC kimlik numarası eksik/fazla girilebilir veya 120 odalı bir otelde oda numarası negatif veya 120’den büyük girilebilir. Amacımız dikkatsizlik sonucu yaşanabilecek olası sorunların önüne geçmek. Bu yüzden üyelere doğrudan erişimi engelleyip (Private), Get ve Set metotları ile kontrollü bir erişim sağlayacağız.
class Musteri { private string AdSoyad; private ulong TCNo; private int OdaNo; public string adsoyad { get { return AdSoyad; } set { AdSoyad = value; } } public ulong tcno { get { return TCNo; } set { if (value.ToString().Length == 11) TCNo = value; else Console.WriteLine("HATA! TC Kimlik Numarası 11 Haneli Olmalıdır."); } } public int odano { get { return OdaNo; } set { if (value > 0 && value <= 120) OdaNo = value; else Console.WriteLine("HATA! Oda Numarası 1-120 Aralığında Olmalıdır. "); } } } class Program { static void Main(string[] args) { Musteri m1 = new Musteri(); m1.adsoyad = "Serdar Yılmaz"; // adsoyad özelliğinin SET metodu çalıştı. m1.tcno = 14548617718; // tcno özelliğinin SET metodu çalıştı. m1.odano = 110; // odano özelliğinin SET metodu çalıştı. // adsoyad, tcno ve odano özelliklerinin GET metodu çalıştı. Console.WriteLine("Ad/Soyad:{0} - Tc No:{1} - Oda No:{2}", m1.adsoyad, m1.tcno, m1.odano); } }
Sınıfın AdSoyad, TCNo, OdaNo üyelerini diğer sınıfların erişimine kapattık (private) ve bu üyelere olan erişimi adsoyad, tcno, odano özellikleri üzerinden kontrollü bir şekilde sağladık. (else bloklarında exception fırlatabilirdik ancak istisnai durum yönetimini anlatmadığımız için şimdilik es geçiyoruz.)
GET Metodu
Bir özelliğin değeri okunmak istenildiğinde o özelliğe ait GET metodu çalışır.
Console.WriteLine(m1.adsoyad);
m1 nesnesinin içerisindeki adsoyad özelliğinin Get metodu çalışacaktır.
SET Metodu
Bir özelliğe atama yapılmak istenildiğinde o özelliğe ait SET metodu çalışır. Atanan değere SET metodu içerisinde value anahtar sözcüğü ile erişilir. value anahtar sözcüğünün önceden belirlenmiş herhangi bir türü yoktur. Özelliğe atanacak değer hangi türden ise value da o türden olur.
m1.adsoyad=”Serdar Yılmaz”;
m1 nesnesinin içerisindeki adsoyad özelliğinin SET metodu çalışacaktır ve value ifadesi “Serdar Yılmaz” değerini alacaktır.
Bir özelliğin sadece GET metodunu tanımlayarak özelliği sadece okunabilir hale getirebiliriz.
Erişim Belirleyicisi Kullanımı
GET ve SET metotlarında erişim belirleyicilerini kullanarak erişimin sınırlarını belirtebiliriz.
private string AdSoyad; public string adsoyad { get { return AdSoyad; } private set { AdSoyad = value; } }
Yukarıdaki örneğimizde SET metodu private olarak bildirildi. Bu yüzden diğer sınıflardan adsoyad özelliğinin değeri okunabilir ancak herhangi bir atama yapılamaz (set metoduna sadece sınıfın içinden erişilebilir). Eğer SET metodunu private olarak bildirmeseydik; adsoyad özelliği public olduğu için SET metodu da otomatikmen public olacaktı.
GET ve SET metotları için herhangi bir erişim belirteci bildirilmezse, varsayılan olarak özelliğin erişim belirtecini alırlar.
Serdar YILMAZ