C# Get ve Set Metotları (Properties)
Bu yazıda properties kavramın bahsedilecektir. Öncelikle OOP'un barındığı bazı konseptler vardır. Bunlar:
- Inheritance (Miras alma/Kalıtım alma)
- Encapsulation (Kapsülleme)
- Polymorphism (Çok biçimlilik)
Bu yazıda bizi ilgilendiren kavram daha çok Encapsulation yani kapsülleme kavramıdır. Bu kavramı kısaca açıklamak gerekirse, bir sınıftan üretilen nesneye ait metot, değişkenlerin dışarıdan ulaşılmasını engellemektir. Kapsülleme işleminde access modifiers yani erişim belirteçleri kullanılmaktadır. Bir nesneye ait değişkene dışarıdan ulaşılmasını engellemek için private denen erişim belirteci kullanılır. private olarak tanımlanan field'a yani alana(sınıf değişkeni) sadece o sınıf içerisinde erişebiliriz.
class Varlik
{
private string ad;
}
Ancak bazı durumlarda bu değişkenlere erişmemiz gerekebilir. Normalde ad değişkenine private yerine public olarak erişim izni verilseydi, dışarıdan ulaşabilir ve üstünde hem okuma yapabilir hem de değişiklik yapabilirdim. Fakat bunun yerine C# çok daha kontrollü bir işlem olan properties'i bize sunuyor. Eğer ad
alan değişkeninin içeriğini ekrana yazdırmak istersek ama bu değişkende bir değişiklik yapılmasını istemiyorsak bunun için en doğru seçim properties olacaktır. Properties bize iki seçenek sunmaktadır, bunlar get
ve set
metotlarıdır: class Varlik
{
private string ad;
public string Ad
{
get { return ad; }
}
}
Dikkat edilirse yukarıda sadece get metotu tanımlandı ve private tanımlı alan değişkeni döndürüldü. Bu şekilde sadece read-only olması sağlanmış oldu. public class Program
{
public static void Main()
{
Varlik varlik = new Varlik();
Console.WriteLine(varlik.Ad);
}
}
Ekran çıktısı olara "isim yok" başarılı bir şekilde elde edilir. Ancak bu döndürülen değişkene atama yapmak istersek: public class Program
{
public static void Main()
{
Varlik varlik = new Varlik();
varlik.Ad = "Ahmet";
}
}
Şu şekilde hata alırız: Compilation error (line 18, col 3): Property or indexer 'Varlik.Ad' cannot be assigned to -- it is read onlyÇünkü Ad property sadece okunabilir olarak çalışmaktadır. Property üzerinden değişiklik yapma iznimiz bulunmamaktadır. Eğer değişiklik yapmak istiyorsak set metodu kullanılmalıdır:
class Varlik
{
private string ad = "isim yok";
public string Ad
{
get { return ad; }
set { ad = value; }
}
}
value diye bir atamak yaptık. Buradaki value ifadesi aslında C#'a ait bir keyword. Kısacası atama yaptığımız değerin temsili hali olarak açıklayabiliriz. Eğer şimdi yaparsak şu şekilde: {
public static void Main()
{
Varlik varlik = new Varlik();
Console.WriteLine(varlik.Ad); // çıktı: isim yok
varlik.Ad = "Ahmet";
Console.WriteLine(varlik.Ad); // çıktı: Ahmet
}
}
Herhangi bir hata almayacağız çünkü o property için hem okuma hem de yazma iznimiz vardır. Not: Farkettiyseniz property Ad olarak tanımlandı. Yani private olan alan değişkenimizin ismi ile aynı ama tek farkı ilk harfin büyük olması. Bu tarz kullanım genel olarak kabul görmüş bir kullanım tipidir. Bu tarz kullanım kod üzerinde okunabilirliğin artmasına olanak sağlar.
Şimdi biraz daha ileri gidelim. Örneğin, programımızda ülke vatandaşlarının kimlik numaralarını int olarak 9 haneden oluşacak şekilde saklıyoruz. Bu kimlik numarası, kimlikNo adında bir private alan değişkeninde saklanmaktadır. Biz bu değişkene değer atamayı property kullanarak gerçekleştireceğiz. Bu durumda kimlik numaranın en başta geçerli olup olmadığını kontrol edip, o şekilde atama işlemini yapmalıyız. Kimlik numarası 0 dan büyük yani pozitif olmalı hem de tam olarak dokuz haneden oluşmalı, ne eksik ne de fazla:
class Vatandas
{
private int kimlikNo;
public int KimlikNo
{
get { return kimlikNo; }
set
{
int haneSayisiKimlikNo = (int)Math.Floor(Math.Log10(value)) + 1;
if (value > 0 && haneSayisiKimlikNo == 9)
{
kimlikNo = value;
}
else throw new ArgumentOutOfRangeException();
}
}
}
Eğer kimlik numara ataması başarılı şekilde yapılmazsa hata fırlatılacak. Bu sayede değişkene kontrollü bir atama sağlanabilir. Bu sayede yazdığımız implement'lere kendi şartlarımızı koyabiliriz, sınırlamalar yapabiliriz. C# ayrıca property kullanımında kolaylıklar sağlamaktadır. Bir sınıfta alan değişkeni tanımlamanda da sadece property'leri aşağıdaki gibi tanımlayabiliriz:
class Vatandas
{
public int KimlikNo
{
get; set;
}
public int dogumYili
{
get; set;
}
}
Bunlar auto-implemented properties olarak bilinmektedir. Sonuç olarak her iki property de okuma ve yazma iznini barındırmaktadır. Yukarı anlattığımız işlevlerde bir farkı yok, sadece tanımlamada daha kısa yoldan bir yöntem sağlamaktadır.
Hiç yorum yok: