28 Şubat 2011 Pazartesi

C# Encapsulation ve Property Kavramı

.Net'in en güzel özelliklerinden birisi, programcının yükünü minimuma indirmesidir. Bir önceki yazımda, Encapsulation kavramından bahsederken field'ı kapsülleyerek, get ve set adlı iki metot yardımı ile kontrolü sağlamıştık. .Net, bizim için bu iki metodu daha rahat kodlayabileceğimiz ve kullanabileceğimiz bir yapı hazırlamıştır. Bu yapı Property'dir (Özellik). Field'lar kapsüllenerek Property'ler yardımı ile dışarıya açılabilmektedir. Nesne Yönelimli Felsefeye göre hiçbir field public olmamalıdır. Doğru kodlama; field'ların private yapılarak, Property'ler yardımı ile dışarı açılmasıdır.

Şimdi Id, Ad ve Fiyat alanları olan bir Urun sınıfı tasarlayalım ve bu alanları kapsülleyerek Property'ler yardımı ile dışarıya açalım.

class Urun

    {

        int _id;

 

        public int Id

        {

            get { return _id; }

            set { _id = value; }

        }

 

        string _ad;

 

        public string Ad

        {

            get { return _ad; }

            set { _ad = value; }

        }

 

        double _fiyat;

 

        public double Fiyat

        {

            get { return _fiyat; }

            set { _fiyat = value; }

        }

    }

İpucu: Kapsüllenmek istenen field'ın üzerine mouse ile gelinerek, ctrl R+E kısayolu kullanılarak property'leri oluşturmak mümkündür. (ctrl tuşuna basılı olarak R'ye, daha sonra E'ye basılması yeterlidir. 3'üne de aynı anda basılmasına gerek yoktur.)

Yukarıda gördüğümüz gibi, her alan private olarak tanımlandıktan sonra, public property'ler yardımı ile kontrol altına alınmış oldu. set metodu gelen değeri field'a atarken, get metodu da field'ı return etmektedir. Aslında en önemlisi; kontrolün, nesnenin kendisini tarafından yapılmasıdır.

-Property, yazımı her ne kadar benzese de bir metot değildir, dolayısı ile () parantezlerini kullanamayız.

resim10

Field'lar ve Property'ler sınıfın 2 ayrı üyesidir. Sadece birbirlerini kullanmaktadırlar. Ayrıca şekilde görüldüğü gibi Property simgeleri, pembe renkli olan metot simgelerinden farklıdır.

Şimdi Fiyat Property'si içerisinde negatif değer girilememesi kontrolünü yapalım;

double _fiyat;

 

public double Fiyat

{

      get { return _fiyat; }

      set

      {

           if (value > 0)

               _fiyat = value;

           else

               Console.WriteLine("Fiyat negatif olamaz");

       }

 }

Şimdi de Program sınıfında bir Urun nesnesi oluşturalım ve Fiyat Property'sine değer ataması yapalım;

class Program

    {

        static void Main(string[] args)

        {

            Urun u = new Urun();

            u.Fiyat = -100;

            Console.WriteLine(u.Fiyat);

        }

    }

Alacağımız sonuç, bir önceki yazıdaki uygulamamız ile aynı sonuç olacaktır;

resim5

Son olarak ILDASM yardımı ile Programın IL kodlarını inceleyelim ve Property'lerin içerisindeki get ve set metotlarının varlığını kanıtlayalım;

resim11

IL kodlarda görüldüğü gibi, arka tarafta bizim için get ve set metotları yazılmış durumda. Bu noktada Property'ler, programcıya sağlanan bir kolaylık olarak da düşünebilirler.



1 yorum:

Adsız dedi ki...

Dependency Injection hakkında bilgi verebilirmisiniz

Yorum Gönder