C# - Encapsulation Nedir
Encapsulation bir sınıf içindeki değişkenlere erişimi sınırlandırmak için kullanılan tekniktir. Sınıf içindeki değişkenimiz dışarıdan müdahale edilebilecek durumdayken istemediğimiz sonuçların önüne geçmek için bunu kontrol almak isteyebiliriz.
Bu konuyu örnekler ile göstermek daha aydınlatıcı olacağı kanaatindeyim. Bu yüzden ilk önce encapsulation kullanmadığımız bir durumda ne gibi sorunlar ile karşılaşırız aşağıdaki örnekte bunu görelim.
Sınıfımız içerisinde public değişkenimiz var. Bu değişkene sınıf örneğimiz üzerinden erişip değer atıyoruz.
using System;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
Musteri musteri=new Musteri();
musteri.Adi = "Gürol";
musteri.DogumYili = -1950;
musteri.Bilgi();
}
}
class Musteri
{
public string Adi;
public int DogumYili;
public void Bilgi()
{
Console.WriteLine("{0}'un yaşı {1}.", Adi, DateTime.Now.Year - DogumYili );
}
}
}
Program çıktısı olarak;
>>> Gürol'un yaşı 3969.
Normal olarak programlama hatası yapmadık fakat mantıksal bir hata sözkonusu oldu. Bir müşterinin yaşı negatif bir değer içeremez hatta yaşayan bir müşteri ise doğal olarak bu yaşta olamaz.
İşte bu tip durumların kontrol altına alınması amacıyla sınıfımız içindeki DogumYili değişkenimize encapsulation tekniği uygulayalım. Aşağıda aynı kod örneğini tekrar yazalım.
using System;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
Musteri musteri=new Musteri();
musteri.Adi = "Gürol";
musteri.DogumYili = -1950;
musteri.Bilgi();
}
}
class Musteri
{
private string _Adi;
public string Adi
{
get { return _Adi; }
set { _Adi = value; }
}
private int _DogumYili;
public int DogumYili
{
get { return _DogumYili; }
set {
if (value > 1900 && value < 2015)
{
this._DogumYili = value;
}
else
{
throw new Exception("Geçersiz bir doğum yılı girdiniz.");
}
}
}
public void Bilgi()
{
Console.WriteLine("{0}'un yaşı {1}.", this._Adi, DateTime.Now.Year - this._DogumYili );
}
}
}
Program çıktısı olarak;
Unhandled exception. System.Exception: Geçersiz bir doğum yılı girdiniz.
at ConsoleApp.Musteri.set_DogumYili(Int32 value) in /home/gurol/NetCode/ConsoleApp/Program.cs:line 39
at ConsoleApp.Program.Main(String[] args) in /home/gurol/NetCode/ConsoleApp/Program.cs:line 11